Edited at

Android/Javaのログ出力を超シンプルにしてくれるlog

More than 3 years have passed since last update.

ログ出力といえばアプリを作る上で最もよく書くコードといっても過言ではないと思います。そんなログ出力ですがAndroid Arsenalを見ていたらよさそうなライブラリを見つけました。


log

https://github.com/zserge/log


今までログ出力に感じていたこと


  • 標準のandroid.util.Log: まぁ簡単だけど同じようなコードを繰り返し書くのがいやになってくる。変数を入れようとするとフォーマットだるい

  • 自作ロガークラス: プロジェクト間で共有するのめんどい

  • 外部ライブラリ: 機能多すぎだったり特定の用途に特化していたり。チームに使い方を周知するのにも一苦労


  • System.out.println: Androidでは使わないで!

  • なかなかチームのログ出力方法がそろわない

logはミニマルかつかゆいところに手が届くライブラリです。

これらの問題をだいたい解決してくれます。


インストール


build.gradle

dependencies {

compile 'co.trikita:log:1.1.5'
}

【追記】1.1.5が出ましたので更新しました


機能・使い方


まずはandroid.util.Log互換。

import trikita.log.Log;

Log.d(TAG, "Hello"); // prints 'D/TAG: Hello'

import android.util.Logimport trikita.log.Logに変えるだけ。

今までどおりのコードで動きます。

大規模なプロジェクトでもスムーズに移行できますね。

さくっと全ファイルの変換をしたい方は次のコマンドで

$ find -name "*.java" -type f -exec sed -i 's/import android.util.Log/import trikita.log.Log/g' {} \;

※ちょっと留意点: タグにその場限りの文字列を使っている場合はタグ扱いされません。

Log.d("タグ", "Hello"); // prints 'D/クラス名: タグ Hello'


楽して書きたい

タグを省略するとクラス名を自動で入れてくれます。

class Foo {

public void foo() {
Log.d("Hello"); // prints 'D/Foo: Hello'
}
}

tagまたはTAGという定数を定義しておけば自動でそれを使ってくれます。

class Foo {

private final static String tag = "Bar";
public void foo() {
Log.d("Hello"); // prints 'D/Bar: Hello'
}
}

オリジナルの定数名でも大丈夫。

class Foo {

static {
Log.useTags(new String[]{"tag", "TAG", "_TAG", "MyTagName"});
}
private final static String _TAG = "Bar";
...
}

メソッドチェーンできる。

Log.d("First")

.d("Second")
.d("Third line");

引数は可変で、連結またはフォーマットに対応しています。

Log.useFormat(true); // フォーマットを使いたい場合

Log.d("X equals %d", 42); // フォーマット。 prints 'X equals 42'
Log.d("Value of X", 42, "Y", 50); // タブ付きで連結。 prints 'Value of X 42 Y 50'

Throwableにも対応。

Exception e = new Exception("foo");

Log.e(e); // エラーメッセージとスタックトレースを出力
Log.d("Something bad happened", someObject, "error:", e);

ログレベルでフィルタリングもできます。

Log.level(Log.I); // ログレベルをInfo以上に設定

Log.d("foo"); // 何も出力されない


Javaで使う

Android以外の環境なら、System.out.printlnが利用できます。

Log.usePrintln(true).d("hello");


リリース時の対応

おまけですが、リリース後のアプリでログを出さないためにProGuardに以下の設定をしておくと便利です。


proguard-rules.pro

-assumenosideeffects class trikita.log.Log {

private static void log(...);
}