CocoaLumberjack日志框架的简单归纳

Posted 猿故

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CocoaLumberjack日志框架的简单归纳相关的知识,希望对你有一定的参考价值。


CocoaLumberjack是一个Mac和ios上快速强大的日志框架。下面简单总结一下我在使用过程中的一些知识点。


# DDFileLogger的几个重要的限制条件


  • maximumFileSize:单个文件最大限制,默认1M,单个文件超过此值会回滚,设置为0可以来禁止文件大小限制

  •  rollingFrequency:回滚频率,默认24h,设置为0或者负数来禁止文件超时自动回滚

  •  logFileManager.maximumNumberOfLogFiles:允许在硬盘保存的archived日志文件数量,默认5个

  •  logFileManager.logFilesDiskQuota:允许日志文件占用的最大硬盘空间,默认20M,设置为0可以禁止此限制


其中maximumFileSize和rollingFrequency都是用来管理文件回滚的,谁先触发,谁就会导致文件回滚。日志文件一旦达到最大大小,会将其名字的后面加一个archived。


如果通过设置maximumFileSize和logFileManager.maximumNumberOfLogFiles来限制日志文件大小和文件数量,那么注意如果两者的乘积如果大于了logFileManager.logFilesDiskQuota的默认值20M,那么创建的文件数量永远达不到最大文件数量。比如设置单个文件最大5M,最多允许创建7个文件,那么永远创建不了第五个文件,因为一旦超过20M,就会自动把最老的日志文件删除并创建一个新的日志文件。此时就需要设置logFileManager.logFileDiskQuota属性了。而官方文档中没有提及过logFileDiskQuota这个属性,稍不注意就会跳进坑里。


比如:


DDFileLogger *fileLogger = [[DDFileLogger alloc] init];

fileLogger.maximumFileSize = 5 * 1024 * 1024; // 5MB

fileLogger.rollingFrequency = 0; // 不限日期

fileLogger.logFileManager.maximumNumberOfLogFiles = 7

fileLogger.logFileManager.logFilesDiskQuota = 35 * 1024 * 1024;

[DDLog addLogger:fileLogger];



# 如何实现文件数量和文件可占用总空间的监控的?


通过KVO maximumNumberOfLogsFiles和logFileDiskQuota属性来监控日志文件数量有没有达到上限以及日志总大小有没有超过文件总大小的限制。


NSKeyValueObservingOptions kvoOptions = NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew;

[self addObserver:self forKeyPath:NSStringFromSelector(@selector(maximumNumberOfLogFiles)) options:kvoOptions context:nil];

[self addObserver:self forKeyPath:NSStringFromSelector(@selector(logFilesDiskQuota)) options:kvoOptions context:nil];



# 需要我们自己在串行队列中异步执行log方法吗?


不需要。其实官方文档的用法介绍中也没有提及这一点。起初,我看到了网上有些人通过类似下面的方式来打印日志:


dispatch_async(dispatch_get_main_queue(), ^{

     DDLogInfo(@"test");

});



其实不需要这样,查看其代码实现可以发现:CocoaLumberjack里面宏定义的打印方法最终都指向了DDLog的log方法。DDLogError默认用同步的方式,DDLogWarn、DDLogInfo、DDLogDebug和DDLogVerbose其他默认用异步的方式。


查看DDLog的log方法,最终会把打印的日志封装成一个消息对象,然后调用``- (void)queueLogMessage:(DDLogMessage *)logMessage asynchronously:(BOOL)asyncFlag``方法,最后又调用了``- (void)lt_log:(DDLogMessage *)logMessage``方法来实现调用对应的logger的``- (void)logMessage:(DDLogMessage *)logMessage``方法去打印日志。



# 需要我们考虑多并发或主线程阻塞吗?


不需要。CocoaLumberjack通过串行队列_loggingQueue来控制日志语句的先进先出(每个级别的logger都有一个对应的queue),用分组_loggingGroup来实现同步(主要针对多处理器,多个logger在一个分组中异步执行日志语句),通过信号量_queueSemaphore控制最大并发数为1000。


虽然官方文档中没有具体讲这些点,但是该框架做到了简约而简单,不需要用户考虑太多,非常容易上手,而一个优秀的框架就应该如此设计。





以上是关于CocoaLumberjack日志框架的简单归纳的主要内容,如果未能解决你的问题,请参考以下文章

(20160604)开源第三方学习之CocoaLumberjack

RestKit 和 CocoaLumberjack 在 Xcode7 中集成为框架

使用CocoaLumberjack时,自定义的log文件名

利用 CocoaLumberjack 搭建自己的 Log 系统

iOS Utils

iOS日志获取和实时浏览器显示日志