iOS10 生成日志文件存储到沙盒

2017-01-14 10:19:54来源:http://www.jianshu.com/p/cb21c9c5ea96作者:_原来如此_人点击

第七城市

为方便后期维护,查看日志文件可快速定位问题所在。

因为iOS10 屏蔽系统NSLog,无法输出日志,可以宏定义如下:


#define NSLog(format, ...) do { /


[[NSString alloc] initWithFormat:@"%s", __FILE__]; /


printf("iOS - [%s] %s/n", __TIME__, [[NSString stringWithFormat:format, ## __VA_ARGS__] UTF8String]);/


} while(0)


由于发现 __TIME__打印出来的时间是固定的,所以改成如下:


#define NSLog(FORMAT, ...) {/


NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];/


[dateFormatter setDateStyle:NSDateFormatterMediumStyle];/


[dateFormatter setTimeStyle:NSDateFormatterShortStyle];/


[dateFormatter setDateFormat:@"HH:mm:ss"]; /


NSString *str = [dateFormatter stringFromDate:[NSDate date]];/


fprintf(stderr,"iOS [%s] %s/n",[str UTF8String], [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);/


}


想打印那些信息自己需要在设置一下。

想从哪里开始生成日志文件,就在哪里条用方法:


#pragma mark --- 生成日志文件


- (void)redirectNSlogToDocumentFolder{


if(isatty(STDOUT_FILENO)) {  //真机调试


return;


}


UIDevice *device = [UIDevice currentDevice];


if([[device model] hasSuffix:@"Simulator"]){ //在模拟器不保存到文件中


return;


}


//将NSlog打印信息保存到Document目录下的Log文件夹下


NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);


NSString *strPathLog = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"msgBackUp"];


NSFileManager *fileManager = [NSFileManager defaultManager];


BOOL fileExists = [fileManager fileExistsAtPath:strPathLog];


if (!fileExists) {


[fileManager createDirectoryAtPath:strPathLog  withIntermediateDirectories:YES attributes:nil error:nil];


}


//日志文件命名格式  设备编号+年月日.log


NSDate *date = [NSDate dateWithTimeIntervalSinceNow:0];


NSDateFormatter *formatter = [[NSDateFormatter alloc]init];


[formatter setDateFormat:@"yyyyMMdd"];


NSString *timeStr = [formatter stringFromDate:date];


NSString *logFilePathCurrent = [strPathLog stringByAppendingFormat:@"/%@%@.log",_deviceNum,timeStr];


// 重定向


freopen([logFilePathCurrent cStringUsingEncoding:NSASCIIStringEncoding], "a+", stdout);


freopen([logFilePathCurrent cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);


NSLog(@"----- connect success,start save log -----");


}


真机测试的时候,无论debug还是release,都能存储到沙盒中。接下来上传服务器就可以了

发现一个问题,此时沙盒中并不实时的接收日志,等待再次执行- (void)redirectNSlogToDocumentFolder方法时,查看沙盒日志文件,里面才有上次的日志。所以,现在的解决办法就是:当 printf打印时,在每一个nslog下面都要重定向一下,这样你立刻到沙盒中,才会发现日志已经写入了。否则,等到你下次重定向时,这次的日志才会写入文件中。


如果有好的方法,请大神多多指点。




第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台