如何选择Logger:Android日志系统分析与比较

:## 为什么

为什么要寻找单独的logger库?用Andorid原生的Log不好吗?原生Log长得这样:

Android Log

先分级,再打上TAG,然后直接输出。功能很基础,平时基本够用。但是在长期的Android开发实践中,我们会发现,这个功能太基础了,当:

  • 每次打TAG都要写下雷同的代码,太不DRY了。
  • 想打印的数据各种打不出,要么就是打出来一长串看的发晕。
  • 为了找某条log是从哪里打出来的,还要花点功夫。
  • 即使找到了,怎么知道运行时是在哪个线程?
  • 日志去了不再来。在未连接调试的手机上,或者调试中不小心重启App了,日志就没了。

不多说了,光这几个问题就够我们有充分的理由去寻找一个新的Log系统了。先从最常用的下手,从网上能搜到最常用的Android logger有两个。

看简介帮助不大,我们还是真刀真枪用一下,看看这两个开源库为什么这么受欢迎,有没有解决我们的问题。

好Logger应该长什么样?

动手分析之前,我们要先想想清楚,我们要的好Logger,应该是什么样的?

打印日志是一门传统艺术,历史悠久,打从有编程那年就开始有了。它与单步调试并称程序调试两大神技,程序员们因为拥护不同的调试方法,分裂成了两大阵营:日志派和调试派,两派互相看不起。调试派说打印日志太没技术含量,还要到处做标记,看我们调试派,想停哪里点哪里,想看什么看什么,调试器能带我飞。日志派也不服气,你能离线调试吗?你能调试多线程错误吗?你能xxx调试吗?

好程序员两种技能都要掌握,现在调试工具越来越好用,单步调试没有任何困难。但是打印日志仍然是不可或缺的必杀技,尤其是查活系统(运行中软件)的问题时,如果没有后台日志或者用户手机日志,真是打死也不知道哪里出了问题。

扯完日志的重要性,认真说说我们对日志系统的需求:

  1. 容易打印:无论什么格式的数据,上到自定义类,下到字节流,都能单行代码给打出来,不用为了打日志写一堆额外的代码逻辑。
  2. 格式漂亮:对格式化数据做打印美化,必要时适当做点排版。
  3. 容易筛选:给日志分级和打标签,就是为了达到这个目的。
  4. 立即定位:每条日志都有两个位置,代码中的位置和运行时位置(所在线程)。这两个位置对快速定位问题很重要。
  5. 灵活设置:日志数量和日志详细程度是一对矛盾体。大多数情况下,普通的日志就够我们分析问题了。但是某些情况下,如多线程问题,异步问题,需要打印尽量详细的信息,这个要能灵活设置。
  6. 日志留存:日志打到屏幕上,说没就没。有没有办法屏幕上打一份,SD卡上存一份,崩溃信息网站上留一份?这有点类似linux上的tee命令。
  7. 容易上手:本来没想写这条,也没想到上面会列出这么多特性,没办法,还是加上个容易上手的指标吧。就是说上边这些特性,

能做到上面几点,我们就认为这个日志系统非常好了。注意,我为什么没提性能要求?因为正式发布版本里,是不会有日志的,起码不会大量存在,所以性能也就无所谓了,别太差就行。尺子有了,我们就用它来衡量一下Timber和Logger。

Logger分析

这个项目在github上有3000+ star,必有过人之处。

  1. 容易打印:除了普通字符串和含变量字符串,还能直接打印json、xml、异常,通过。
  2. 格式漂亮:的确漂亮,但是过分漂亮了。本来一行的日志给打成了8行,真超值。结果赠品太多,都找不到我想看的那条了。
Logger截图
  1. 容易筛选:能分级,能自动打tag,能自定义tag。等等,为什么tag不是类名?难道用类名当tag不是普世价值观吗?明白了,它的类名和方法名都在日志内容中有了,tag中不用再放一个了。但是有Android Monitor依赖症的我表示,这让我怎么筛选一眼望不到头的日志呀,差评。
  2. 立即定位:能跳转到文件位置,能看函数名、线程号,通过。
  3. 灵活设置:可以设置,但是设置项似乎不太丰富呀。
  4. 日志留存:不支持。
  5. 容易上手:一行代码就能用,通过。

Timber分析

这个库非常简洁,准确讲,它只有一个文件,是Jake Wharton大神自己用的。大神说嫌拷贝来拷贝去太麻烦,才开源成一个库。

  1. 容易打印:支持普通字符串和含变量字符串。
  2. 格式漂亮:不支持。
  3. 容易筛选:自动用类名当tag,也可以自定义。
  4. 立即定位:不支持。
  5. 灵活设置:支持,但没什么设置项。
  6. 日志留存:支持。
  7. 容易上手:还是吐槽一下,这个库的tree和plant是什么鬼?我是读完它的代码才明白的。其实跟树、种树、木头没一毛钱关系,大神只是借种树这个形象的方法,说日志可以写到各种地方去。想写哪里写哪里,自己plant一个自己实现的Tree就可以了。不种树就没有日志。大神太幽默了。

总结

从总评价看,显然Logger更好,特性更丰富。但是它的排版我实在接受不了。所以项目实践中,我还是会用Timber。全剧终。

我去,这个结局太不能让人满意了,选了半天选了个不好用的,这世界怎么了?

改进

权衡之下,还是改造一下Logger吧。在github上fork了Logger的代码,针对Logger不满的地方,加入我的改动。为了保持Logger自身的特点,新改动通过Settings的形式加入,我给Settings加入mode设置。默认是pretty模式,一切用法与输出结果与原Logger保持一致,可以通过单元测试。如果对PRETTY模式下日志过多有意见,可以启用brief模式,去除无用的分割线,把默认日志从8行减为4行,保持可读性和所有信息。如果还嫌多,可以启动single模式,默认日志从8行压缩到1行,保持必要信息。代码库见https://github.com/oreofish/logger

对这个改进的版本重新评估如下:

  1. 容易打印:同原作。
  2. 格式漂亮:可以方便的在8行的pretty模式,和4行的简洁模式,和1行的单行模式中切换。
  3. 容易筛选:能分级,能自动打tag,能自定义tag。单行模式下用Android Monitor过滤日志很方便。通过。
  4. 立即定位:同原作,而且重点保持了"能跳转到文件位置"这个特性,通过。
  5. 灵活设置:可以设置。
  6. 日志留存:暂不支持(我很喜欢这个特性,有空要加上)。
  7. 容易上手:一行代码就能用,通过。
  8. 彩蛋:写代码时经常会加上一些临时的日志,例如一大串相同的字符,只是为了在日志堆里容易看到。改进版本中加入了预定义的表情字符串IAMHERE1到IAMHERE6,就是为了容易看到。

开源大法好。这,就是我想要的日志系统。我会尝试提交代码给Logger官方,虽然由于思路不同,他们可能不会合并我的代码:)

结论

  • 如果对日志要求不高,简单用用而已,Android自带的Log就不错。
  • 如果厌烦了Android Log,觉得用着不方便,Timber和Logger都是好选择,Timber只要一个文件。
  • 如果你觉得日志很重要,特别推荐的我的改进版Logger。
  • 还觉得不好?把你的需求说出来,或者自己动手改进,都欢迎。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,392评论 25 707
  • 本文会不定期更新,推荐watch下项目。如果喜欢请star,如果觉得有纰漏请提交issue,如果你有更好的点子可以...
    天之界线2010阅读 7,157评论 11 29
  • 一.榜单介绍 排行榜包括四大类: 单一框架:仅提供路由、网络层、UI层、通信层或其他单一功能的框架 混合开发框架:...
    伟子男阅读 5,239评论 0 161
  • 文/亦翎 九月 你寡断优柔 是怕看到秋风扫阶 还是怕把日子过老 九月 你虽显得枯燥 却允我一季繁华 又该让我用多少...
    21世纪新文阁阅读 347评论 4 19
  • 吹拍总乏术,奔走亦无门。 辗转如浮萍,破冰步难行。 人情难练达,道阻志不穷。 乘桴浮海去,终究意难平。 ~~201...
    九郎问道阅读 432评论 1 1