iOS中控制NSLog输出时机详解
-(void)saveDEBUGlog{
NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*documentDirectory=[pathsobjectAtIndex:0];
NSDateFormatter*dateFormatter=[[NSDateFormatteralloc]init];
[dateFormattersetDateFormat:@"yyyy_MM_dd_HH_mm_ss"];
NSString*currentDateStr=[dateFormatterstringFromDate:[NSDatedate]];
NSString*fileName=[NSStringstringWithFormat:@"testLog_%@.log",currentDateStr];
NSString*logFilePath=[documentDirectorystringByAppendingPathComponent:fileName];
//先删除已经存在的文件
NSFileManager*defaultManager=[NSFileManagerdefaultManager];
[defaultManagerremoveItemAtPath:logFilePatherror:nil];
//将log输入到文件
freopen([logFilePathcStringUsingEncoding:NSASCIIStringEncoding],"a+",stdout);
freopen([logFilePathcStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);
}
这个方法主要是调用freopen这个方法来写入,其中stdout和stderr囊括了iOS大部分的异常输出。
2.根据Bool值控制log输出
用户在使用app遇到各种各样的问题,当自己以及测试团队不好定位原因的时候,能将用户把关键点的log发送过来是最好的分析方法了。但是如何将app运行过程中的log截取一部分保存呢?像开关一样能够控制log的读写呢?通过阅读MQTTLog源码发现获得的灵感。
首先对NSLog进行下宏替换,项目中统一使用SLOG来进行输出
#defineSLOG(fmt,...)if(reportLoggerIsOpen)NSLog((@"%s[Line%d]"fmt),__PRETTY_FUNCTION__,__LINE__,##__VA_ARGS__)
从宏定义可以看出,reportLoggerIsOpen是控制Log输出的开关,对于reportLoggerIsOpen的定义,在h文件中先extern声明这个变量,然后再m文件中去实现。
.h文件
#importexternBOOLreportLoggerIsOpen; .m文件 BOOLreportLoggerIsOpen=NO; +(void)setLogOpen:(BOOL)open{ reportLoggerIsOpen=open; }
通过setLogOpen这个方法,就能够收放自如的控制日志写入了。比如你需要抓取登录模块的日志,那么就在登录前传入true,登录完毕后,传入false,即可只保留登录模块的日志了。