TimberをLogの代わりに使用して快適ログ確認

やぎすけAdventCalendar2016 Android

Posted on Dec 6


こんにちは、やぎにいです。
やぎすけ Advent Calendar 2016の6日目です。そろそろキツくなってきましたね。
昨日は僕がStethoを使ってGoogle Chromeでデバッグをするを書きました。

今日はAndroidプロジェクトを作って結構な確率で導入するライブラリで書いた2つ目のTimberの使い方をまとめたいと思います。

導入

Timberの導入をします。
build.gradlecompile 'com.jakewharton.timber:timber:4.3.1'を追加してあげるだけです(バージョンは執筆時)。
このTimberはandroid.util.Logをラッパーしているライブラリなので非常に軽量です。とても嬉しい。

次にアプリケーションクラスで初期化しましょう(TimberではTreeplantすると言います ちょっとおしゃれ)。

1
2
3
4
5
6
7
8
public class MyApplication extends Application {
  @Override
  public void onCreate() {
    super.onCreate();

    Timber.plant(new DebugTree());
  }
}

これで導入が完了しました。
今までLog.d();Log.e();などと書いていた部分はすべてTimber.d();Timber.e();に置き換えることが出来ます。
releaseビルドではログを出力したくない!というときは以下のように書けばdebugビルドだけで有効になります。

1
2
3
4
5
6
7
8
9
10
public class MyApplication extends Application {
  @Override
  public void onCreate() {
    super.onCreate();

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

簡単ですね。
これでリリースしてるアプリのログを見られてしまうということもなくなります。
非常に軽量ですし、LogではなくTimberを使わない利点が無いですね!

Treeをカスタマイズする

plantで渡しているのがnew DebugTree()であるように、このTreeは自分でカスタマイズすることが出来ます。
DebugTreeTreeクラスを継承しており、Treeクラスは抽象クラスとして書かれています。
https://github.com/JakeWharton/timber/blob/master/timber/src/main/java/timber/log/Timber.java#L573
https://github.com/JakeWharton/timber/blob/master/timber/src/main/java/timber/log/Timber.java#L390
このへん。

自分用にTreeをカスタマイズするときはDebugTreeを継承して作ってあげるといいでしょう。

1
2
3
public class MyDebugTree extends Timber.DebugTree {
  // ここで自分好みのTreeをつくる
}

試しに、Android Studioとかを使っていて、エラー落ちした際に該当コードの該当行数に飛ぶ機能がありますが、それをDebugにもつけてあげましょう。
あの機能はログメッセージにat packageName(fileName:lineNumber)が付けばいいのでそれっぽく書きます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MyDebugTree extends Timber.DebugTree {
    @Override
    protected void log(int priority, String tag, String message, Throwable t) {
        StackTraceElement[] thread = new Throwable().getStackTrace();

        if (thread != null && thread.length >= 5) {
            StackTraceElement stack = thread[5];
            String className = stack.getClassName();
            String packageName = className.substring(0, className.lastIndexOf("."));
            String fileName = stack.getFileName();

            String msg = message + " at " + packageName + "(" + fileName + ":" + stack.getLineNumber() + ")";

            Log.println(priority, tag ,msg);
        }
        else {
            Log.println(priority, tag, message);
        }
    }
}

これを3日目で書いたRecyclerViewのサンプルアプリに突っ込んで起動してみると。

こんな感じで`MainActivity.javaの42行目にクリックで飛べるようになりました。
以外と便利ですね。

ただ、結構ガバガバなTreeになってるのでごめんなさい(かなり知識不足です)。

おわりに

今回はStetho同様デバッグがしやすくなるライブラリTimberの使い方と、Treeの拡張方法をご紹介しました。
僕は間違いなくAndroidのプロジェクトを作成した直後にTimberをbuild.gradleに追加するところから始まると思います。

Treeの拡張方法に寄っては、debugビルド時はDebugTree()を使うが、releaseビルドの際は自分でTreeを拡張したMyReleaseTree()などを定義してその中でCrashlyticsをどうこうしてクラッシュログを収集するとかいう使い方もできるでしょうか。
僕は未だにrelease用のログ設定を作ったことが無いのでわかりませんが何れやってみたいと思います。

以上、やぎにいでした!


このエントリーをはてなブックマークに追加
comments powered by Disqus

<< ButterKnifeを使ってソースコードのダイエットをする     Stethoを使ってGoogle Chromeでデバッグをする >>



2018やぎ小屋