客户端的日志很重要。有时很多线上发生的或者是用户反馈的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++上的日志记录。