CocoaLumberjack

第三方库的简单使用与学习

2016-05-07 | 阅读

CocoaLumberjack 日志的使用学习

CocoaLumberjack是Mac和iOS上一个集快捷,简单,强大和灵活于一身的日志框架,其有很多种Logger,如:

  • DDASLLogger 将 log 发送给苹果服务器,之后在 Console.app 中可以查看
  • DDTTYLogger 将 log 发送给 Xcode 的控制台
  • DDFileLogger 讲 log 写入本地文件

其处理流程如下,所有的Log都会发送给DDLog对象,然后其将log分发给注册的一个或者多个Logger,这步是并发的,效率很高.每个Logger处理收到的log时会询问Formatter,来获取Log消息格式,然后分发到不同的地方,如同时打到控制台和本地文件中.

图片

支持的Log等级:

typedef NS_OPTIONS(NSUInteger, DDLogFlag) {
    DDLogFlagError      = (1 << 0), // 0...00001
    DDLogFlagWarning    = (1 << 1), // 0...00010
    DDLogFlagInfo       = (1 << 2), // 0...00100
    DDLogFlagDebug      = (1 << 3), // 0...01000
    DDLogFlagVerbose    = (1 << 4)  // 0...10000
};
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)
};

DDLogFlag是一次log的等级,而DDLogLevel是log输出等级,如果一次log的等级,低于这个Logger的level,就不会打log.

DDLogger协议定义了一个logger对象应该遵守的方法和变量,同时又提供了DDAbstractLogger,来供继承并实现自己的logger.还有一个DDAbstractDatabaseLogger,是针对写入数据库的log设计的.

具体使用:

在pch文件中添加全局loglevel的设置 :

#ifdef DEBUG
static const int ddLogLevel = DDLogLevelVerbose;
#else
static const int ddLogLevel = DDLogLevelWarning;
#endif

然后在应用初始化时,设置Logger.

// 添加一个命令行输出logger
[DDLog addLogger:[DDTTYLogger sharedInstance]]; // TTY = Xcode console
 // 设置控制台输出彩色
[[DDTTYLogger sharedInstance] setColorsEnabled:YES];
// 添加一个ASL输出logger
[DDLog addLogger:[DDASLLogger sharedInstance]]; // ASL = Apple System Logs

// 添加一个文件输出logger
DDFileLogger *fileLogger = [[DDFileLogger alloc] init]; // File Logger
fileLogger.rollingFrequency = 60 * 60 * 24; // 24 hour rolling
fileLogger.logFileManager.maximumNumberOfLogFiles = 7;
[DDLog addLogger:fileLogger];

...
// 各种等级的log.
DDLogVerbose(@"Verbose");
DDLogDebug(@"Debug");
DDLogInfo(@"Info");
DDLogWarn(@"Warn");
DDLogError(@"Error");

要设置控制台输出彩色,要下载插件XcodeColors,然后还要在Scheme manager中,选择Run - Arguments - Environment Variable ,添加一个属性,名称为XcodeColors ,值为YES.

这样使用就可以输出彩色Logger了,还可以自己设置颜色,默认的颜色为:

DDLogFlagError   = (red, nil)
DDLogFlagWarning = (orange, nil)

随便设置一下颜色:

[[DDTTYLogger sharedInstance] setForegroundColor:[UIColor colorWithHexString:@"333333"] backgroundColor:nil forFlag:DDLogFlagVerbose];
[[DDTTYLogger sharedInstance] setForegroundColor:[UIColor colorWithHexString:@"339933"] backgroundColor:nil forFlag:DDLogFlagDebug];
[[DDTTYLogger sharedInstance] setForegroundColor:[UIColor colorWithHexString:@"660066"] backgroundColor:nil forFlag:DDLogFlagInfo];
[[DDTTYLogger sharedInstance] setForegroundColor:[UIColor colorWithHexString:@"FF3366"] backgroundColor:nil forFlag:DDLogFlagWarning];
[[DDTTYLogger sharedInstance] setForegroundColor:[UIColor colorWithHexString:@"990033"] backgroundColor:nil forFlag:DDLogFlagError];

然后就有这样的彩色logger了:

彩色logger

但是这样的logger还是不符合要求的,因为少了logger的定位信息,所以必须要设置logFormatter来显示这些定位信息,需要实现DDLogFormatter协议的- (NSString *)formatLogMessage:(DDLogMessage *)logMessage;.

DDLogMessage中,我们可以看到,一个logger中返回了很多数据:

@interface DDLogMessage : NSObject <NSCopying>
{
    // Direct accessors to be used only for performance
    @public
    NSString *_message; // 具体logger内容
    DDLogLevel _level; // 全局lever等级
    DDLogFlag _flag; // log的flag等级
    NSInteger _context; // 
    NSString *_file; // 文件
    NSString *_fileName; // 文件名称
    NSString *_function; // 函数名
    NSUInteger _line; // 行号
    id _tag; // 
    DDLogMessageOptions _options; //
    NSDate *_timestamp; // 时间
    NSString *_threadID; // 线程id 
    NSString *_threadName;// 线程名称
    NSString *_queueLabel; // gcd线程名称
}

然后随便实现一个formatter:

- (NSString *)formatLogMessage:(DDLogMessage *)logMessage {
    return [NSString stringWithFormat:@"[[[FILE : %@ - FUNCTION : %@ - LINE : %@ \n TIME : %@ - THREAD : %@ / %@ - QUEUEID : %@  ]]] \n %@ ",logMessage.fileName,logMessage.function,@(logMessage.line),logMessage.timestamp,logMessage.threadName,logMessage.threadID,logMessage.queueLabel,logMessage.message];
}