Timber的使用与分析

Android开发中,不可避免的需要使用日志Log.Android原生的Log每次都需要指定Tag,而且指定Tag之后依然很难定位到确定位置.这就引出今天要讲的工具--Timber.

Timber 介绍

github地址
依赖地址:


implementation 'com.jakewharton.timber:timber:4.7.0'

官方介绍:

This is a logger with a small, extensible API which provides utility on top of Android's normal Log class.
I copy this class into all the little apps I make. I'm tired of doing it. Now it's a library.
Behavior is added through Tree instances. You can install an instance by calling Timber.plant. Installation of Trees should be done as early as possible. The onCreate of your application is the most logical choice.
The DebugTree implementation will automatically figure out from which class it's being called and use that class name as its tag. Since the tags vary, it works really well when coupled with a log reader like Pidcat.
There are no Tree implementations installed by default because every time you log in production, a puppy dies.

注:以上英文只是copy下来装13用,不用硬啃~~~
简单来说:

  1. Timber是一款可扩展的Logger工具
  2. Timber通过Timber.plant来添加tree实例
  3. Timber需要在使用前添加完成tree实例,最好在Application的onCreate中实现
  4. Timber默认实现的DebugTree将调用它的类的名称作为Tag(没有指定tag时使用)

通过以上几点,我们总结一下:
Timber需要在Application的onCreate中通过Timber.plant添加tree实例(默认Timber是没有Tree实例的).

Timber的使用

1. 初探

为了防止手忙脚乱,我们直接来看官方Demo的初始化:

    @Override
    public void onCreate() {
        super.onCreate();

        if (BuildConfig.DEBUG) {
            Timber.plant(new DebugTree());
        } else {
            Timber.plant(new CrashReportingTree());
        }
    }

像大部分的博客中介绍的一样,Timber的初始化根据打包状态(BuildConfig.DEBUG)的不同,添加不同的tree实例.
但是如果真的copy这段代码到项目中就会发现

初始化Timber时的问题

哎,我CrashReportingTree呢?

在源码中得知,CrashReportingTree是框架外实现的类,源码如下

   /**
     * A tree which logs important information for crash reporting.
     */
    private static class CrashReportingTree extends Timber.Tree {
        @Override
        protected void log(int priority, String tag, @NonNull String message, Throwable t) {
            if (priority == Log.VERBOSE || priority == Log.DEBUG) {
                return;
            }

            FakeCrashLibrary.log(priority, tag, message);

            if (t != null) {
                if (priority == Log.ERROR) {
                    FakeCrashLibrary.logError(t);
                } else if (priority == Log.WARN) {
                    FakeCrashLibrary.logWarning(t);
                }
            }
        }
    }

这次学乖了,不先copy代码,我们看一下这段源码内不熟悉的类FakeCrashLibrary,源码如下

/** Not a real crash reporting library! */
public final class FakeCrashLibrary {
  public static void log(int priority, String tag, String message) {
    // TODO add log entry to circular buffer.
  }

  public static void logWarning(Throwable t) {
    // TODO report non-fatal warning.
  }

  public static void logError(Throwable t) {
    // TODO report non-fatal error.
  }

  private FakeCrashLibrary() {
    throw new AssertionError("No instances.");
  }
}

not a real crash reporting library:不是真正的崩溃报告库
就是说,CrashReportingTree()其实并没有任何意义~
整这半天,Timber是在闹呢!

其实,Timber这么做是为了提供一种思路,告诉咱们开发者Timber可以自己写Tree实例,并且根据不同情境使用自定义Tree.如此可害苦了初次接触Timber的人.

2. 无差错使用

在日常使用中,我们除了开发中需要日志外,其他并没有过硬的需求.
所以,初始化时,我们可以去掉未成熟的CrashReportingTree,仅设置DebugTree:

        /**
         * 仅在Debug时初始化Timber
         */
        if (BuildConfig.DEBUG) {
            Timber.plant(new DebugTree());
        }
    

也可以将DebugTree添加到Timber中,通过控制isLoggable来控制日志的输出:

        Timber.plant(new DebugTree() {
            @Override
            protected boolean isLoggable(@Nullable String tag, int priority) {
                return BuildConfig.DEBUG;
            }
        });

3. 测试日志输出

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

推荐阅读更多精彩内容