美文网首页藤原とうふ店(自家用)
iOS日志本地化---日志重定向

iOS日志本地化---日志重定向

作者: 叫我龙哥 | 来源:发表于2017-05-09 19:43 被阅读253次

写在前面

本文主要是给读者分享技术的,如何保存能控制台输出的log,以便于查找程序本身出现的问题。

我们该如何做

首先

我们要判断,是不是模拟器

#if !(TARGET_IPHONE_SIMULATOR)//真机
    //连接xcode时可以从监视器中看日志 没连接时Log日志会输出到文件中,
    [self redirectNSLogToDocumentFolder];
    NSLog(@"真机");
#else//模拟器
    NSLog(@"模拟器");
#endif

其次

我们还要接着判断是不是真机连接了Xcode,然后才开始进行日志本地化文件的生成

- (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) {
        [fileManager createDirectoryAtPath:logDirectory  withIntermediateDirectories:YES attributes:nil error:nil];
    }
    
    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]];
    self.filepath = [logDirectory stringByAppendingFormat:@"/%@.log",dateStr];
    
    // 将log输入到文件
    freopen([self.filepath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stdout);
    freopen([self.filepath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);
    
    //未捕获的Objective-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* item in symbols )
    {
        [ strSymbols appendString: item ];
        [ 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]) {
        [fileManager createDirectoryAtPath:logDirectory  withIntermediateDirectories:YES attributes:nil error:nil];
    }
    
    //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"];
    
    AppDelegate *app = [UIApplication sharedApplication].delegate;
    NSString *dateStr = [formatter stringFromDate:app.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:app.filepath]) {
        [crashString writeToFile:app.filepath atomically:YES encoding:NSUTF8StringEncoding error:nil];
    }else{
        NSFileHandle *outFile = [NSFileHandle fileHandleForWritingAtPath:app.filepath];
        [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];
}

使用

在AppDelegate的这个方法中编写如下代码

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
#if !(TARGET_IPHONE_SIMULATOR)//真机
    //连接xcode时可以从监视器中看日志 没连接时Log日志会输出到文件中,
    [self redirectNSLogToDocumentFolder];
    NSLog(@"真机");
#else//模拟器
    NSLog(@"模拟器");
#endif
return YES;
}

相关文章

  • iOS日志本地化---日志重定向

    写在前面 本文主要是给读者分享技术的,如何保存能控制台输出的log,以便于查找程序本身出现的问题。 我们该如何做 ...

  • iOS学习笔记40-日志重定向

    一、日志重定向 我们在iOS开发过程中,我们时常会使用NSLog打印到控制台的日志信息进行代码调试,但这样调试的前...

  • docker日志轮转

    总结 1、可以实现日志输出重定向; 2、可以通过配置日志轮转规则实现docker日志轮转压缩。 操作如下: 1、修...

  • iOS 查看及导出项目运行日志

    级别:★☆☆☆☆标签:「iOS 查看及导出项目运行日志」「iOS 查看日志」「iOS 查看崩溃日志」作者: WYW...

  • iOS 符号化闪退日志

    iOS分析崩溃日志 二 iOS应用崩溃日志分析 iOS崩溃crash大解析

  • iOS开发小技巧

    将Log日志重定向输出到文件中保存

  • iOS 日志重定向输出

    在app的调试阶段,我们通常需要通过打印的日志来发现并解决问题。但是在使用真机调试时,如果真机没有连接到Xcode...

  • iOS15之后苹果崩溃日志解析方法

    iOS15之后苹果崩溃日志解析方法 背景 iOS 15之后,iPhone 崩溃日志崩溃之后,崩溃日志的组织格式有变...

  • Rsyslog服务无法生成目录文件

    问题: rsyslog接收syslog数据后重定向日志保存路径(特定路径下/opt)无法按照路径产生目录及日志文件...

  • iOS 查看及导出项目运行日志

    iOS 查看及导出项目运行日志iOS 查看及导出项目运行日志

网友评论

    本文标题:iOS日志本地化---日志重定向

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