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,即可只保留登录模块的日志了。