NSLog再见!!你好,CocoaLumberjack

来源:互联网 发布:店铺淘宝客采集软件 编辑:程序博客网 时间:2024/05/04 02:36
刚学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 DEBUGstatic 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。

当然CocoaLumberjack还有更多功能,详情见github。

0 0