其他部分

敬请期待

Xlog

首先说一下为什么拿 LOG4CPP 做比较:

  • 同是 C++ 所写的日志组件,语言上性能应该相近,都可以做到跨平台

  • LOG4CPP 是一个优秀的框架

仔细分析两个日志框架的原理可以看出,内部实现有诸多不同,不能简单的直接拿来做比较, Xlog 考虑到移动终端的特点,会对日志进行压缩,而 LOG4CPP 诞生时移动互联网的时代还没到来,主要是为 PC 而做的一套框架(下面所有测试 LOG4CPP 选用的是 RollingFileAppender, 和 Xlog 每天一个日志文件的功能类似)。 综合以上考虑我通过两种情况去做了比较(需要注意的是不同的时间相同的机型同样的案例测试结果可能有变化):

Xlog 去掉压缩加密部分,和 LOG4CPP 放在同一个起点上对比, 每条日志为长度为 100 的随机字符串。详细数据如下:

测试时间:2016-12-31
1w 条日志耗时1w条日志大小10w 条日志耗时10w条日志大小
iPhone 6 使用 xlog115 ms1.9 M1155 ms19 M
iPhone 6 使用 log4cpp329 ms1.4 M3252 ms13.8 M
HUAWEI MATE 8 使用 xlog452 ms1.5 M4685 ms15.4 M
HUAWEI MATE 8 使用 log4cpp581 ms1.38 M6249 ms13.8 M
SAMSUNG GT-I9500 使用 xlog1130 ms1.5 M13997 ms19.5 M
SAMSUNG GT-I9500 使用 log4cpp4148 ms1.4 M46631 ms13.8 M
Motorola Nexus 6 使用 xlog1300 ms1.5 M12328 ms15 M
Motorola Nexus 6 使用 log4cpp3848 ms1.3 M36110 ms14 M
测试时间:2017-06-06
1w 条日志耗时1w条日志大小10w 条日志耗时10w条日志大小init 耗时
iPhone 6 使用 xlog116 ms1.9 M1127 ms19 M10 ms
iPhone 6 使用 log4cpp486 ms1.4 M4867 ms13.8 M2 ms
HUAWEI MATE 8 使用 xlog437 ms1.6 M4303 ms16.1 M1 ms
HUAWEI MATE 8 使用 log4cpp588 ms1.45 M5981 ms14.5 M1 ms
SAMSUNG GT-I9500 使用 xlog机器损坏----
SAMSUNG GT-I9500 使用 log4cpp机器损坏----
Motorola Nexus 6 使用 xlog2130 ms1.5 M21930 ms15 M9 ms
Motorola Nexus 6 使用 log4cpp7372 ms1.3 M63166 ms14 M3 ms

从上面的数据其实就能看出来 iPhone 和华为的机器的存储做的要比其他几个厂家要优秀。这里可能会有人有疑问,为什么两个组件都不压缩,产生的日志大小差别这么大,这里就需要看一下两个组件打的日志内容:

2016-12-31 12:24:19,579 [4485227456] WARN - KRCJTDMXOUSBBEXAMPTZGBXRYMKHPYHWDOZIICGGMYDASYCERVWFIEIOUYAPWXGAYSOJDWADFRXPJPEMMTYMGEBASRNLRRPTXTBR

上面的是 LOG4CPP 打的日志,包括时间、线程名、日志级别、日志内容。 再看下面是 Xlog 打的日志,不仅包含 LOG4CPP 有的所有东西,还增加了进程名、 TAG、文件名、函数名、行号。如果想让 LOG4CPP 增加这些信息,并没有那么简单,因为 Xlog 打印日志的接口是宏,很容易获取到这些信息,但是 LOG4CPP 打印日志的接口是函数。

[I][2016-12-31 +8.0 12:24:19.793][45420, 106652628366400*][][ViewController.mm, viewDidLoad, 86][JDCIKXWEKOFNKEOPRYCYGGGCKXAJRRQRABREHRZLOHMWKLEAFGVJPJSVKPGVPQBQJXWYOAZZSJIPMUNTRTATYVXQZUFGVNUZVLMO

Xlog 默认的实现(带有压缩),和 LOG4CPP 对比, 每条日志为长度为 100 的随机字符串。测试时间:2016-12-31,详细数据如下:

1w 条日志耗时1w条日志大小10w 条日志耗时10w条日志大小
iPhone 6 使用 xlog420 ms955 K4175 ms9.3 M
iPhone 6 使用 log4cpp331 ms1.4 M3236 ms13.8 M
HUAWEI MATE 8 使用 xlog755 ms1 M7585 ms10 M
HUAWEI MATE 8 使用 log4cpp606 ms1.4 M6356 ms14 M
SAMSUNG GT-I9500 使用 xlog1972 ms1 M18489 ms10.4 M
SAMSUNG GT-I9500 使用 log4cpp4743 ms1.3 M47944 ms13.8 M
Motorola Nexus 6 使用 xlog1825 ms1 M17831 ms10 M
Motorola Nexus 6 使用 log4cpp3776 ms1.3 M36359 ms14 M

Xlog 默认的实现(带有压缩和加密),和 LOG4CPP 对比, 每条日志为长度为 100 的随机字符串。测试时间:2017-06-06,详细数据如下:

1w 条日志耗时1w条日志大小10w 条日志耗时10w条日志大小init 耗时
iPhone 6 使用 xlog430 ms956 K4348 ms9.3 M19 ms
iPhone 6 使用 log4cpp487 ms1.4 M4892 ms13.8 M2 ms
HUAWEI MATE 8 使用 xlog753 ms1 M7593 ms10 M5 ms
HUAWEI MATE 8 使用 log4cpp596 ms1.4 M5988 ms14 M2 ms
SAMSUNG GT-I9500 使用 xlog机器损坏----
SAMSUNG GT-I9500 使用 log4cpp机器损坏----
Motorola Nexus 6 使用 xlog2832 ms1 M27288 ms11 M20 ms
Motorola Nexus 6 使用 log4cpp5963 ms1.3 M63588 ms14 M3ms

单从耗时上看的话, Xlog 在 iPhone 和 Mate 8 上面是比不过 LOG4CPP 的,这里其实是因为这两个厂家的存储做的都很优秀,即使直接写文件,性能也不算很差,而 Xlog 压缩日志也需要一部分时间。

其他厂家,Xlog 是完胜 LOG4CPP。可能会有人觉得 Xlog 使用压缩后两个日志大小也并没有差别很大。熟悉 LZ77 压缩算法的人应该知道,这种随机字符串可压缩率极低,而应用中的日志大部分都是比较容易重复的字符串。在微信中使用 Xlog 的压缩率是 83%(即 100 M文件可以压缩为 17 M)

即使在 Mate 8 上耗时 LOG4CPP 短于 Xlog, 我依然不推荐使用 LoG4CPP。不只是因为 LOG4CPP 会占用用户更多的存储空间,还因为哪怕存储做的再优秀,当系统给 write 的缓存占用内存超过 dirty_ratio 会直接阻塞写入的线程,如果非 UI 线程可能还好,UI 线程的话会表现为卡顿。

接口易用上 Xlog 比 LOG4CPP 方便很多, 但因为 Xlog 接口处大量使用了宏,可读性上应该是没有 LOG4CPP 强。

通过上面的对比,可以发现 Xlog 是更适合移动 App 环境使用的。Xlog 的耗时在长尾型的机器覆盖中更有优势,且针对移动环境对用户额外存储占用更少量的原则,通过压缩实际应用中可以有比较高的日志空间优化。 但是在扩展性上面, LOG4CPP 是优秀于 Xlog 的,只是大家思考下,类似远程的 appender 这种,客户端需要吗。Xlog 并不是不能做这些扩展,只是考虑了移动端是否需要这些扩展。

希望大家继续关注 Xlog,继续关注 Mars,微信开源愿与大家一起成长,谢谢大家。

更多的使用范例,大家请仔细阅读Sample。使用过程中有任何问题或建议,欢迎联系我们!