zoukankan      html  css  js  c++  java
  • CocoaLumberjack

    刚学iOS时候,调试找问题的时候一般就两种方式.
    1.输出NSLog日志。
    2.打断点,一步一步查看问题,查找崩溃点所在的方法,再进一步查看崩溃具体原因,稍微高级一点的就在控制台用命令打印各种参数。
    现在看看实在是没什么技术含量,知道我遇到了她-[CocoaLumberjack](https://github.com/CocoaLumberjack/CocoaLumberjack)
    

    先来看看她有什么高级的?

    1.简单
      CocoaLumberjack集成简单,可以方便的添加进工程,并且DDLog宏与系统的NSLog用法,格式相同,使用简单,不会有难度。
    2.快速
      在大多数用例中,CocoaLumberjack比NSLog执行快了一个数量级。
    3.CocoaLumberjack与Xcode插件XcodeColors 配合,可实现控制台日志的彩色输出。
    4.一个日志可以发送到多个logger,可以显示在控制台,可以存储在数据库,本地文件中,还可以上传服务器,满足我们的多样需求。
    5.自定义日志。
     我们可以根据系统的运行环境,定义不同级别的日志,自定义日志的格式,颜色,存储的日志文件的周期,文件最大个数,文件大小等等。
    

    如何使用 ?

    1. 添加CocoaLumberjack到工程。
    2. 配置你的专属log系统
    3. 替换NSLog,玩转DDLog。

    把Lumberjack框架添加到你的项目

    CocoaLumberjack包含几个对象分别可以把Log输出到不同的地方: 
    1.DDASLLogger -发送日志语句到苹果的日志系统,它们显示在Console.app上 
    2.DDTTYLoyger -发送日志到控制台 
    3.DDFIleLoger -发送日志到文件。 
    4.DDAbstractDatabaseLogger -发送到DB

    通过ddLogLevel定义日志等级:

    typedef NS_ENUM(NSUInteger, DDLogLevel) {
        DDLogLevelOff       = 0,
        DDLogLevelError     = (DDLogFlagError),                       // 0...00001
        DDLogLevelWarning   = (DDLogLevelError   | DDLogFlagWarning), // 0...00011
        DDLogLevelInfo      = (DDLogLevelWarning | DDLogFlagInfo),    // 0...00111
        DDLogLevelDebug     = (DDLogLevelInfo    | DDLogFlagDebug),   // 0...01111
        DDLogLevelVerbose   = (DDLogLevelDebug   | DDLogFlagVerbose), // 0...11111
        DDLogLevelAll       = NSUIntegerMax                           // 1111....11111 (DDLogLevelVerbose plus any other flags)
    };

    相信大家差不多都能看懂,它们是一种包含的枚举。

    • DDLogLevelOff ,关闭所有日志
    • DDLogLevelError,只打印error 级别的日志
    • DDLogLevelWarning ,打印error,warning级别的日志
    • DDLogFlagInfo,打印error,warning,Info级别的日志
    • DDLogLevelDebug,打印error,warning,Info,debug级别的日志
    • DDLogFlagVerbose,打印error,warning,Info,debug,verbose级别的日志
    • DDLogLevelAll,打印所有日志,不知包含上述几种,还有其他级别的日志。

    接下来配置我们的专属log系统

    • 自定义日志格式。 
      新建WJFormatter 继承自NSObject,遵循DDLogMatter协议,并实现其协议方法,-(NSString )formatLogMessage:(DDLogMessage )logMess
    {
        NSString *loglevel = nil;
        switch (logMessage.flag)
        {
            case LOG_FLAG_ERROR:
            {
                loglevel = @"[ERROR]->";
            }
                break;
            case LOG_FLAG_WARN:
            {
                loglevel = @"[WARN]-->";
            }
                break;
            case LOG_FLAG_INFO:
            {
                loglevel = @"[INFO]--->";
            }
                break;
            case LOG_FLAG_DEBUG:
            {
                loglevel = @"[DEBUG]---->";
            }
                break;
            case LOG_FLAG_VERBOSE:
            {
                loglevel = @"[VBOSE]----->";
            }
                break;
    
            default:
                break;
        }
        NSString *formatStr = [NSString stringWithFormat:@"%@ %@___line[%ld]__%@", loglevel, logMessage->_function,logMessage->_line, logMessage->_message];
        return formatStr;
    }
    • 自定义日志发送策略,及各级别日志显示颜色。 
      我的做法是新建一个DDLogManager 单例类来负责管理DDLog的个性化配置。

    • 自定义打印日志级别。 
      同样在DDLogManager里边写一个宏定义。

    #if DEBUG
    static const DDLogLevel ddLogLevel = DDLogLevelVerbose;
    #else 
    static const DDLogLevel ddLogLevel = DDLogLevelError;
    #endif

    在DEBUG模式下打印DDLogLevelVerbose级别日志,RELEASE模式下只打印DDLogLevelError级别日志。注意:ddLogLevel名字不要自己定义,否则出错。

    /**配置日志信息*/
    - (void)config
    {
        WJLogFormatter *logFormatter = [[WJLogFormatter alloc] init];
    
        //1.发送日志语句到苹果的日志系统,它们显示在Console.app上
    //    [[DDASLLogger sharedInstance] setLogFormatter:logFormatter];
    //    [DDLog addLogger:[DDASLLogger sharedInstance]];//
    
        //2.把输出日志写到文件中
        DDFileLogger *fileLogger = [DDLogManager shareInstence].fileLogger;
        [fileLogger setLogFormatter:logFormatter];
        [DDLog addLogger:fileLogger withLevel:DDLogLevelError];//错误的写到文件中
    
        //3.初始化DDLog日志输出,在这里,我们仅仅希望在xCode控制台输出
        [[DDTTYLogger sharedInstance] setLogFormatter:logFormatter];
        [[DDTTYLogger sharedInstance] setColorsEnabled:YES];// 启用颜色区分
        [[DDTTYLogger sharedInstance] setForegroundColor:DDMakeColor(255, 0, 0)
                                         backgroundColor:nil
                                                 forFlag:DDLogFlagError];
        [[DDTTYLogger sharedInstance] setForegroundColor:DDMakeColor(125,200,80)
                                         backgroundColor:nil
                                                 forFlag:DDLogFlagInfo];
        [[DDTTYLogger sharedInstance] setForegroundColor:DDMakeColor(200,100,200)
                                         backgroundColor:nil
                                                 forFlag:DDLogFlagDebug];
    
        [DDLog addLogger:[DDTTYLogger sharedInstance]];//
    
        //4.添加数据库输出
    //    DDAbstractLogger *dateBaseLogger = [[DDAbstractLogger alloc] init];
    //    [dateBaseLogger setLogFormatter:logFormatter];
    //    [DDLog addLogger:dateBaseLogger];
    }
    /**
     *  初始化
     *
     *  @return 日志系统管理器对象
     */
    +(instancetype)shareInstence
    {
        static DDLogManager *logmanager = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            logmanager = [[self alloc] init];
        });
        return logmanager;
    }
    
    -(instancetype)init
    {
        self = [super init];
        if (self)
        {
            self.fileLogger = [[DDFileLogger alloc] init];
            self.fileLogger.rollingFrequency = 60 * 60 * 24; // 24 hour rolling
            self.fileLogger.logFileManager.maximumNumberOfLogFiles = 7;
            self.fileLogger.maximumFileSize = 1024 * 1024 * 2;
        }
        return self;
    }
      config方法里边不必不必全写,根据自己的要求添加要用的日志发送策略即可。
      另可根据喜好设置不同级别日志的颜色,方便在控制台查找。
    
      DDLog默认的文件管理器,iPhone的话,日志文件是存放在~/Library/Caches/Logs.文件夹中。
      log文件命名如 "<bundle identifier> <date> <time>.log"
    

    故我们通过如下方法取日志文件路径。

    /*获得系统日志的路径**/
    -(NSArray*)getLogPath
    {
        NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSString * logPath = [docPath stringByAppendingPathComponent:@"Caches"];
        logPath = [logPath stringByAppendingPathComponent:@"Logs"];
        NSFileManager * fileManger = [NSFileManager defaultManager];
        NSError * error = nil;
        NSArray * fileList = [[NSArray alloc]init];
        fileList = [fileManger contentsOfDirectoryAtPath:logPath error:&error];
        NSMutableArray * listArray = [[NSMutableArray alloc]init];
        for (NSString * oneLogPath in fileList)
        {
            //带有工程名前缀的路径才是我们存储的日志路径
            if([oneLogPath hasPrefix:[NSBundle mainBundle].bundleIdentifier])
            {
                NSString * truePath = [logPath stringByAppendingPathComponent:oneLogPath];
                [listArray addObject:truePath];
            }
        }
        return listArray;
    }

    -当然这是默认的存储区域,如果自定义一个文件管理器类继承自DDFileManager ,重写存储方法,读取方法相应也要改变。

    最后我们就可以用DDLog来替换工程中的NSLog了.

    使用不同的宏打印不同级别的Log

    • DDLogError(frmt, …) 打印Error级别的Log
    • DDLogWarn(frmt, …) 打印Warn级别的Log
    • DDLogInfo(frmt, …) 打印Info级别的Log
    • DDLogDebug(frmt, …) 打印Debug级别的Log
    • DDLogVerbose(frmt, …) 打印Verbose级别的Log

    到这里控制台彩色日志还没有实现,因为还要用到之前提到的XcodeColors插件.

    就是这个

    时间紧急,链接有空再加。 
    下面还需一步(见截图): 
    配置Environment Variable

    “YES”不要写成”Yes”,或其他,否则还是没有效果。

    [真机调试的时候可能会收到内存警告,建议连接真机及上线打包时去掉这一项]。 
    OK,That’s all. 
    实验一把, 
    控制台日志

    相比NSLog,是不是瞬间有种高大上的感觉。 
    事实上也确实是,如果你正在寻找一个app企业级的日志框架,如果你还在为偶尔出现,重复困难的bug烦恼,不妨试试CocoaLumberjack。

    扩展阅读:// http://blog.csdn.net/zhonggaorong/article/details/51656169

    最怕你一生碌碌无为 还安慰自己平凡可贵
  • 相关阅读:
    我非要捅穿这 Neutron(三)架构分析与代码实现篇(基于 OpenStack Rocky)
    我非要捅穿这 Neutron(二)上层资源模型篇
    $('.one + div')选取class为one的下一个元素
    15分钟,教你用Python爬网站数据,并用BI可视化分析!
    $("div span")选取里的所有的元素
    根据给定的元素名匹配元素
    根据给定的类名匹配元素
    根据给定的id匹配一个元素
    想创业,请问有没有投资小的项目?
    Vue组件间的通信
  • 原文地址:https://www.cnblogs.com/fakeCoder/p/5093709.html
Copyright © 2011-2022 走看看