美文网首页DevSupport
如何将NSLog的数据和崩溃信息保存到本地文件中

如何将NSLog的数据和崩溃信息保存到本地文件中

作者: 懒得起名的伊凡 | 来源:发表于2015-08-20 01:28 被阅读1655次

照例先上github地址

做这个的原因
程序测试时并不是总是连着Xcode的,这就导致如果测试过程中程序出现崩溃时,可能是由于数据异常引起的,而我们有无法看到数据,连接Xcode重测时,有时候问题并不能重现,导致很多问题无法确认,所以想把所有NSLog输出的数据,保存到文件中。这样,当程序出问题时,我们只需导出log文件,查看,便可很容易的复现问题。

用法

  • 如果想要NSLog输出的内容和崩溃信息都放入日志文件中,就在application:didFinishLaunchingWithOptions:方法中实现方法redirectNSLogToDocumentFolder
  • 如果只是想要保存崩溃信息到日志文件中,只需在application:didFinishLaunchingWithOptions:方法中实现NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);就可以了。

保持淡定, 人生从此不再寂寞。(其实,这只是个分割线,哈哈)

文笔不好,还是直接上代码

- (void)redirectNSLogToDocumentFolder
{
//如果已经连接Xcode调试则不输出到文件
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 *logDirectory = [[paths objectAtIndex:0]stringByAppendingPathComponent:@"Log"];
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL fileExists = [fileManager fileExistsAtPath:logDirectory];
if (!fileExists) {
    NSError *error = nil;
    [fileManager createDirectoryAtPath:logDirectory withIntermediateDirectories:YES attributes:nil error:&error];
    if (error) {
        NSLog(@"error = %@",[error localizedDescription]);
    }
}

NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setLocale:[[NSLocale alloc]initWithLocaleIdentifier:@"zh_CN"]];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
//每次启动都保存一个新的日志文件中
NSString *dateStr = [formatter stringFromDate:[NSDate date]];
NSString *logFilePath = [logDirectory stringByAppendingFormat:@"/%@.log",dateStr];

//将log文件输出到文件
freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a++", stdout);
freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a++", stderr);
//捕获Object-C异常日志

NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
}

void UncaughtExceptionHandler(NSException* exception)
{
NSString *name = [exception name];
NSString *reason = [exception reason];
NSArray *symbols = [exception callStackSymbols];
//异常发生时的调用栈
NSMutableString *strSymbols = [[NSMutableString alloc]init];
//将调用栈平成输出日志的字符串
for (NSString *str in symbols) {
    [strSymbols appendString:str];
    [strSymbols appendString:@"\r\n"];
}
//将crash日志保存到Document目录下的Log文件夹下
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *logDirectory = [[paths objectAtIndex:0]stringByAppendingPathComponent:@"Log"];

NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:logDirectory]) {
    NSError *error = nil;
    [fileManager createDirectoryAtPath:logDirectory withIntermediateDirectories:YES attributes:nil error:&error];
    if (error) {
        NSLog(@"error = %@",[error localizedDescription]);
    }
}

NSString *logFilePath = [logDirectory stringByAppendingPathComponent:@"UncaughtException.log"];

NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setLocale:[[NSLocale alloc]initWithLocaleIdentifier:@"zh_CN"]];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *dateStr = [formatter stringFromDate:[NSDate date]];

NSString *crashString = [NSString stringWithFormat:@",- %@ ->[Uncaught Exception]\r\nName:%@,Reason:%@\r\n[Fe Symbols Start]\r\n%@[Fe Symbols End]\r\n\r\n",dateStr,name,reason,strSymbols];

//把错误日志写到文件中
if (![fileManager fileExistsAtPath:logFilePath]) {
    [crashString writeToFile:logFilePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
}else{
    NSFileHandle *outFile = [NSFileHandle fileHandleForWritingAtPath:logFilePath];
    [outFile seekToEndOfFile];
    [outFile writeData:[crashString dataUsingEncoding:NSUTF8StringEncoding]];
    [outFile closeFile];
}

//把错误日志发送到邮箱
NSString *urlStr = [NSString stringWithFormat:@"mailto://(此处为邮箱地址)?subject=bug&body=感谢您的配合错误详情:%@",crashString];
NSURL *url = [NSURL URLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication]openURL:url];
}

注:这段代码写的挺早了,参考链接已找不到,不能贴出来,但仍要感谢。

相关文章

  • 如何将NSLog的数据和崩溃信息保存到本地文件中

    照例先上github地址 做这个的原因程序测试时并不是总是连着Xcode的,这就导致如果测试过程中程序出现崩溃时,...

  • 文件操作

    一、文件操作 1.数据本地化将数据以文件的形式,储存到本地磁盘中(程序中保存的数据都是存到内存中的,当程序运行结束...

  • json文件操作及异常捕获

    json文件 数据本地化:将数据保存到本地文件中 json文件(文本),就是文件后缀是.json的文件。内容必须是...

  • 2018-07-26 python学习json文件

    数据本地化: 将数据保存到本地文件中(文本、json、数据库) json文件(文本),就是文件后缀是.json的文...

  • python 使用 odoo10 客户端上传文件接口

    一丶上传单个文件 保存到本地文件夹 二丶上传多个文件保存到本地数据库

  • python文件操作

    文件操作 1.数据本地化 将数据以文件的形式,存储到本地磁盘中。(程序中变量保存的数据都是存到内存中的,当程序运行...

  • Python学习八十六天:item 数据model保存到数据库中

    1.如何将item 数据model保存到数据库中 首先在本地创建好MySQL数据库,再数据库中创建好数据表 2. ...

  • day17 文件操作

    1. 文件操作 os库提供了很多和文件管理操作 1.1 数据本地化和数据持久化 通过文件将数据存到硬盘中数据库文件...

  • JVM性能调优实战(八) - 字节码指令

    基于栈的架构 把常量2压栈,存到本地变量1中 把常量3压栈,存到本地变量2中 将本地变量1数据压栈将本地变量2数据...

  • 01-08file

    file文件 1.数据本地化和数据持久化 将数据以文件的形式存到计算机硬盘中(程序中保存的数据,当程序运行结束后会...

网友评论

    本文标题:如何将NSLog的数据和崩溃信息保存到本地文件中

    本文链接:https://www.haomeiwen.com/subject/igrgqttx.html