NSLog再见!!你好,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。

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

猜你喜欢

转载自blog.csdn.net/oXiMing1/article/details/48658877