移动端日志系统怎么搭建
端上日志系统非常重要,对于用户侧的异常、排障、动线、行为等很多重要数据,都可以通过端上日志来做检索。如何搭建一套准确、高性能的完备日志 SDK 就显得尤为重要。 (另一个重要的排障信息源是埋点,通过埋点可以获取更精准的用户动线。后面有时间做一下埋点数据化方面的总结)。
移动端日志系统,将承载 Native、h5、动态化等多技术栈环境下的日志收口工作,同时要兼顾日志不丢不乱和高性能,其实还是有不少挑战的。
这一方面 CocoaLumberjack 其实已经做的很好,很多公司都用它作为自己的日志系统的基础框架。但它还不能作为大型 app 的流量日志收口系统。因为流量大了以后,少量的日志丢失也会带来很大的缺口,而性能方面它也有很多短板。
mmap 可以在 IO 性能方面有显著的提升,也就是后端比较通用的零拷贝技术。在移动端上 FastImageCache 对 mmap 有较深的应用,但它业务绑定太强,一般无法直接使用,更多的是学习 mmap 的落地。
本文会对日志系统的一些完备要素做一些说明,并特别讲解下 CocoaLumberjack、FastImageCache 两个技术库。
- 日志是否全量。很多业务开发同学不使用日志 SDK 做日志输出,可能使用系统日志做打印,这一部分日志是否需要做收口,需要权衡一下。
- 分等级和模块。分 Level 和 modules 进行记录和检索,可以提供问题排查速度。这方面有专业的 Debug/Info/Error 等标准。技术上比较好实现。
- 性能。主要是卡顿和耗电。日志系统会底层基础架构,大流量的打入,会频繁的内存释放、I/O,过多的占用 CPU 会导致卡顿和耗电,也会影响拖延上层业务异步代码的执行时机。
- 数据不丢不乱。没有办法做到完全的不丢日志,只能尽可能少的减少。在 crash / CPU 繁忙 / 压缩加密严重耗时拖延队列等异常场景,这方面问题尤其突出。不乱就需要增加串型队列或者锁,这些同步机制都需要保障阻塞和性能。
- 实时观测。开发和测试同学需要能够实时看到日志打印情况,这在开发和提测阶段非常有用。
- 压缩 + 加密。压缩和加密都是耗时操作,对 CPU 的压力比较大。
- 上报。得有回捞机制,得保障数据传输安全。
- 后端系统。前置的采集完成后,后端系统的数据化检索、数据可视化等工作都是重中之重。
- 隐私安全。这一块国内所有厂商都极度匮乏。大厂的开发同学也可以随意捞取用户日志,异常日志在内部系统可以随意传播。如果有这方面的诉求,那么整套安全体系都需要建立起来。