iOS平台常见日志库简介
客户端的日志很重要。有时很多线上发生的或者是用户反馈的bug只能通过客户端记录的日志进行排查。对于App来说,引入一个可靠灵活的日志记录库是非常必要的。
日志库需要解决的问题
日志库要解决的问题就是可靠的存储App运行时产生的行为记录。要达到可靠存储的目标需要考虑的问题有很多,如日志丢失,卡顿,影响性能,日志的安全性等等。
1. 可靠性
日志记录的可靠性比较重要,日志丢失,日志文件损坏,日志文件操作错误,日志顺序不对等等这些问题都是需要考虑的。
2. 高性能
日志记录很关键,但不能影响到正常的代码执行。
3. 安全性
目前通过NSLog记录的日志在Mac上使用控制台程序可以直接看见,日志的安全性对大部分App是非必需的。但是如果涉及到敏感日志信息,最好不要输出到日志中。
业内移动端日志库简介
目前,业内有各式各样的日志库。流行的大概有以下几种:
CocoaLumberjack
CocoaLumberjack类似于流行的日志框架(如log4j),是专为Objective-C设计的,利用了多线程、GCD、Objective-C运行时的动态特性。
NSLogger
NSLogger是专为Objective-C设计的日志记录库,带有Mac端的日志查看软件。主要特性是在PC上实时查看手机或者模拟器产生的日志。
xlog
xlog是微信开源的Mars中日志组件,具有日志压缩,加密等功能。详细介绍:https://mp.weixin.qq.com/s/cnhuEodJGIbdodh0IxNeXQ?
Logan
Logan是最近美团开源的日志组件,具有日志压缩,加密等功能。详细介绍:https://tech.meituan.com/Logan.html
Glog
Glog是Google的一个开源库,用于实现应用级别的logging。 它提供了一系列类似于C++流风格的logging API,以及一些预定义的宏。使用c++编写,偏向c++代码中的日志记录。
日志库功能对比
日志库的基础功能就是记录日志,除此之外,可能会加入一些日志分级、压缩、加密、上传服务器等一些功能。
功能 | CocoaLumberjack | NSLogger | xlog | Logan | Glog |
---|---|---|---|---|---|
使用语言 | OC | OC | c,c++,OC | c,OC | c++ |
使用许可 | BSD-3 | BSD | MIT | MIT | BSD |
维护状态 | 好 | 中 | 好 | 好 | 中 |
使用量 | 高 | 差 | 中 | 差 | 中 |
可定制性 | 高 | 差 | 中 | 中 | 差 |
性能 | 中 | 中 | 高 | 高 | 高 |
记录文件 | √ | √ | √ | √ | √ |
日志分级 | √ | √ | √ | √ | √ |
mmap | x | x | √ | √ | x |
日志压缩 | √ | x | √ | √ | x |
日志加密 | x | x | √ | √ | x |
Sqlite日志 | √ | x | x | x | x |
CoreData日志 | √ | x | x | x | x |
CocoaLumberjack在github上star数量较多,使用量比较大。可定制性比较高,能够自定义输出。xlog,Logan使用了mmap技术,在性能上好于其他库,但日志输出的定制性较差。
关于日志加密
加密功能 | CocoaLumberjack | xlog | Logan |
---|---|---|---|
是否支持 | 扩展支持 | 原生支持 | 原生支持 |
加密方式 | 每条日志加密后写入文件 | 流式加密 | 流式加密 |
第三方库 | 无 | micro-ecc | mbedtls |
CocoaLumberjack库不提供日志加密功能,需自己实现加密功能。具体方式:定义继承自DDAbstractLogger的Logger,重写logMessage方法,对每条message进行加密处理。
xlog库提供日志加密功能,需引入micro-ecc库。
Logan库提供日志加密功能,需引入mbedtls库。
关于日志压缩
压缩功能 | CocoaLumberjack | xlog | Logan |
---|---|---|---|
是否支持 | 扩展支持 | 原生支持 | 原生支持 |
压缩方式 | 整个文件压缩 | 流式压缩 | 流式压缩 |
CocoaLumberjack库官方提供简单的日志压缩功能Demo。具体方式:定义继承自DDLogFileManagerDefault的LogFileManager类,在其中压缩已记录完成的日志文件。
xlog库提供日志压缩功能。方式是流式压缩,官方给定压缩率大概在80%左右。
Logan库提供日志压缩功能。方式同xlog,是流式压缩。
引入后文件大小(库文件不包含模拟器架构)
文件大小 | CocoaLumberjack | xlog | Logan |
---|---|---|---|
原始库大小 | 1.5M | 36.4M(log库1.6M,common库34.8M) | 2M |
SDK增大 | 1.5M | 36M | 2M |
App增大 | 0.3M | 0.1M | 0.1M |
我们需要在SDK中引入日志库,然后再在App中加入SDK。
CocoaLumberjack由OC编写,其中OC类即使不使用到也会被引入到最终的App中,所以最终App增大0.3M。只保留相关功能的OC类可以精剪大小。
xlog库由c++编写,并依赖腾讯的Mars库中的comm库,所以打包出来的库较大。但由于是用c和c++编写,没有引用到的代码不会打包进最终的App中。xlog库使用到了comm库的部分内容,comm库大小可以再做精剪。
Logan库由c编写,SDK和App大小增幅均较小。
开源库功能总结
CocoaLumberjack侧重功能上的通用性,有较高的可定制性;不用修改源码,即可添加日志输出重定向,日志压缩,日志加密等功能。
NSLogger侧重编码调试时查看手机日志,可以在Mac上实时查看手机日志,对于个人Debug调试较为方便。
xlog, Logan侧重平台上的通用性,底层代码在Android,iOS上通用;并较为看重性能及日志加密;可定制性较差。
Glog侧重c++上的日志记录。