利用 CocoaLumberjack 搭建自己的 Log 系统

Posted iOS开发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用 CocoaLumberjack 搭建自己的 Log 系统相关的知识,希望对你有一定的参考价值。

一直需要一个 Log 系统,可以将程序运行过程中打的 log 发送到自己服务器,方便之后数据分析或者除错。之前也尝试过找一些第三方服务,但看来看去,国内貌似没看到专门做这一块的,而国外看了下有 Loggly,似乎满足需求,但它要收费且日志保存时间太短。后来无意间看了下 Loggly 提供的 SDK 源代码,发现了 CocoaLumberjack 这个好东西,而 Loggly 其也不过就是在 CocoaLumberjack 上自定义了 Logger 和 Formatter 而已。自己做的话,也很简单。

先说下需求,我理想中的 Log 系统需要:

  • 可以设定 Log 等级

  • 可以积攒到一定量的 log 后,一次性发送给服务器,绝对不能打一个 Log 就发一次

  • 可以一定时间后,将未发送的 log 发送到服务器

  • 可以在 App 切入后台时将未发送的 log 发送到服务器

其他一些需求,比如可以远程设定发送 log 的等级阀值,还有阀值的有效期等,和本文无关就不写了。

开始动手前,先了解下 CocoaLumberjack 是什么:

CocoaLumberjack 最早是由 Robbie Hanson 开发的日志库,可以在 ios 和 MacOSX 开发上使用。其简单,快读,强大又不失灵活。它自带了几种log方式,分别是:

  • DDASLLogger 将 log 发送给苹果服务器,之后在 Console.app 中可以查看

  • DDTTYLogger 将 log 发送给 Xcode 的控制台

  • DDFileLogger 讲 log 写入本地文件

CocoaLumberjack 打一个 log 的流程大概就是这样的:



所有的 log 都会发给 DDLog 对象,其运行在自己的一个GCD队列(GlobalLoggingQueue),之后,DDLog 会将 log 分发给其下注册的一个或多个 Logger,这步在多核下是并发的,效率很高。每个 Logger 处理收到的 log 也是在它们自己的 GCD队列下(loggingQueue)做的,它们询问其下的 Formatter,获取 Log 消息格式,然后最终根据 Logger 的逻辑,将 log 消息分发到不同的地方。

因为一个 DDLog 可以把 log 分发到所有其下注册的 Logger 下,也就是说一个 log 可以同时打到控制台,打到远程服务器,打到本地文件,相当灵活。

CocoaLumberjack 支持 Log 等级: