美文网首页
iOS把nslog写进文件

iOS把nslog写进文件

作者: ChasonTse | 来源:发表于2019-01-31 11:12 被阅读6次


    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    加入
    [self redirectNSLogToDocumentFolder];

    - (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]];
        NSString *logFilePath = [logDirectory stringByAppendingFormat:@"/%@.log",dateStr];
        
        //将log输入到文件
        freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stdout);
        freopen([logFilePath 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"];
        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://test@163.com?subject=bug报告&body=感谢您的配合!<br><br><br>错误详情:<br>%@",crashString ];
        //    NSURL *url = [NSURL URLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
        //    [[UIApplication sharedApplication] openURL:url];
    }
    

    自己按需修改

    相关文章

      网友评论

          本文标题:iOS把nslog写进文件

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