NSLog的注释及使用重定向;控制台内容写入文件

来源:互联网 发布:网站环境搭建linux 编辑:程序博客网 时间:2024/05/18 03:04

http://my.oschina.net/u/615517/blog/90279


IOS应用发布NSLog的注释及使用重定向

1 选择工程的Target -> Build Settings -> Preprocessor Macros.

如图,默认 Debug项,是“DEBUG=1”.


2 在程序中设置全局宏定义

在程序的 ApplicationName-Prefix.pch 文件中,加入如下,很简单

#ifdef DEBUG_MODE#define DLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )#else#define DLog( s, ... )#endif

3 这样就设置好了,测试

在任意ViewController.m中写入 

DLog(@"1234");

结果:

2012-07-25 17:09:54.448 xxxx[7094:707] <0x28f790 ViewController.m:(64)> 1234
这样发布的时候DLog就不会有输出了。


把控制台内容写入文件

在Objective-c开发程序的时候,有专门的日志操作类NSLog,它将指定的输出,输出到(stderr),我们可以利用Xcode的日志输出窗口,那么既然是要记录到具体日志文件,我们就想输出日志写入到具体的日志文件即可。
 
代码
1、  宏定义(下面是我在程序中常用到的日志宏,用DEBUG开关管理,
也就是说只有在DEBUG模式下才让日志输出 :)
 

#ifdef DEBUG #  define LOG(fmt, ...) do {                                            \         NSString* file = [[NSString alloc] initWithFormat:@"%s", __FILE__]; \         NSLog((@"%@(%d) " fmt), [file lastPathComponent], __LINE__, ##__VA_ARGS__); \         [file release];                                                 \     } while(0) #  define LOG_METHOD NSLog(@"%s", __func__) #  define LOG_CMETHOD NSLog(@"%@/%@", NSStringFromClass([self class]), NSStringFromSelector(_cmd)) #  define COUNT(p) NSLog(@"%s(%d): count = %d\n", __func__, __LINE__, [p retainCount]); #  define LOG_TRACE(x) do {printf x; putchar('\n'); fflush(stdout);} while (0) #else #  define LOG(...) #  define LOG_METHOD #  define LOG_CMETHOD #  define COUNT(p) #  define LOG_TRACE(x) #endif


 
可以看到,除了标准的用户定义输出外,我还加入了许多有用的信息,
比如源程序文件位置,行号,类名,函数名等。具体的应用可以在具体的开发过程中添加、删除。
 
2、  应用:
- (void)redirectNSLogToDocumentFolder{     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);     NSString *documentsDirectory = [paths objectAtIndex:0];     NSString *fileName =[NSString stringWithFormat:@"%@.log",[NSDate date]];     NSString *logFilePath = [documentsDirectory stringByAppendingPathComponent:fileName];     freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr); }  - (void)applicationDidFinishLaunching:(UIApplication *)application {     // 真机测试时保存日志     if ([CDeviceInfo getModelType] != SIMULATOR) {         [self redirectNSLogToDocumentFolder]; } }


 
真机测试的时候,可以利用freopen将标准错误输出保存到指定的文件当中,
这样就可以在问题发生后分析日志文件。
 
3、  设置DEBUG标志是否正确定义
 
Xcode 一般会在 debug 运行配置项里面已经定义号了DEBUG 标志,如果没定义我们就自己写上,以我的 Xcode 6.1 为例,在PROJECT--Build Settings中找到 PreProcessor Macros 这个属性,对于 Debug 配置我们给他写上 DEBUG,而在 Release 配置中把它留空。 这样我们刚才那段预处理命令就可以根据这个标志来判断我们编译的时调试版本还是发布版本,从而控制 NSLog 的输出。



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机网页无法加载插件怎么办 微信公众号被投诉怎么办 住了酒店的尾房怎么办 喜欢前任的闺蜜怎么办 闺蜜给介绍对象怎么办 喜欢对象的发小怎么办 山东省直医保卡丢失怎么办 高铁票如果错过了怎么办 动车错过了时间怎么办 长途动车错过了怎么办 动车如果错过了怎么办 没有取票错过了怎么办 动车出站没检票怎么办 火车晚点耽误了下班车怎么办 动车票中途丢了怎么办 购买二手房异地铁路公积金怎么办 沈阳公积金卡丢了怎么办 住宅专项维修资金用完了怎么办 广州出租车丢了东西怎么办 广州的士丢了东西怎么办 网上找兼职被骗了怎么办 海信空调开不了机怎么办 海信空调遥控器开不了怎么办 学生遭套路贷反被仲裁怎么办 赏脸打错字尝脸怎么办 红掌的花变黑了怎么办 红掌花苞发黑了怎么办 水培植物腐根了怎么办 水培绿萝水发臭怎么办 水里养花根烂掉怎么办 桅子花叶子发黑怎么办 大株月季烂根怎么办 月季水浇多了烂根的怎么办 金桔盆栽烂根怎么办 盆栽的长寿果树烂根怎么办 家里的石榴烂根怎么办 山桔盆栽烂根怎么办 养的植物烂根怎么办 桅子花叶子长霉怎么办 紫薇花叶子干了怎么办 高层玻璃阳台往下看恐高怎么办