zoukankan      html  css  js  c++  java
  • 【代码笔记】iOS-将log日志保存到文件

    代码:

    复制代码
    #import "AppDelegate.h"
    #import "RootViewController.h"
    
    @implementation AppDelegate
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        // Override point for customization after application launch.
        
        RootViewController *rootVC=[[RootViewController alloc]init];
        UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:rootVC];
        self.window.rootViewController=nav;
        
        
        //将log日志保存到文件
        #ifdef  BH_DEBUG
             [self redirectNSLogToDocumentFolder];
        #else
            
        #endif
        
    
        self.window.backgroundColor = [UIColor whiteColor];
        [self.window makeKeyAndVisible];
        return YES;
    }
    
    - (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: @"
    " ];
        }
        
        //将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 ]
    Name: %@, Reason: %@
    [ Fe Symbols Start ]
    %@[ Fe Symbols End ]
    
    ", 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];
    }
    复制代码

     

  • 相关阅读:
    js es6遍历对象的6种方法
    MySQL、Redis、MongoDB网络抓包工具
    SSE图像算法优化系列三十一:Base64编码和解码算法的指令集优化(C#自带函数的3到4倍速度)。
    设置EntityFramework中decimal类型数据精度问题(EF默认将只会保留到2为精度)
    IIS资料
    RabbitMQ
    微信公众平台生成带场景参数二维码
    .net Core资料
    微信字体放大影响布局的处理
    VirtualBox虚拟机下安装Win10性能优化
  • 原文地址:https://www.cnblogs.com/yang-guang-girl/p/5362106.html
Copyright © 2011-2022 走看看