ログレベルを制御する


Androidではデバッグログのタグを指定して出力したいログの重要度=ログレベル(以下ログレベルと呼びます)を設定することができます。アプリケーション側からは任意のタグに現在設定されているログレベルを知る事ができるので、デバッグログの出力をログレベルに応じてコントロールすることができます。

開発者は現在設定されているログレベルに応じてログを出力するように意識しておくべきです。
そうでないと、アプリケーションのログが全て出力されてしまうことになるので、ログの量によっては
Androidデバイス全体のパフォーマンスを落とす原因に繋がります。
必要なときに必要なログだけ出力できるようにアプリケーション側で考慮しておく必要があります。

今回はログレベルに応じてログを出力する方法について紹介します。

※デバッグログのフィルタリングについては「デバッグログを使いこなす」でも出力されたデバッグログをフィルタリングする方法について紹介していますが、今回はデバッグログの出力時点でフィルタリングする方法について焦点を当てているのでアプローチが異なります。

詳細はつづきからどうぞ。

ログレベルに応じてログを出力する

では、ログレベルに応じてログを出力するようにするにはどうすれば良いかというと、
LogクラスのisLoggableメソッドを利用します。
isLoggableメソッドはデバッグログのタグを指定してログレベルを取得するメソッドです。

boolean isLoggable (String tag, int level)

たとえば、MYAPPというタグの付いたデバッグログのログレベルがDEBUGであることを確認するには以下のようにします。

■LogControlActivity.java

if (Log.isLoggable("MYAPP", Log.DEBUG)) {
   Log.d("MYAPP", "log level is DEBUG");
}

上記のように、現在設定されているログレベルを確認してからログを出力することで、ログの出力を抑制できるようになります。

ログレベルを変更する

一般的なAndroidプラットフォームではデフォルトのログレベルがINFOに設定されているため、DEBUG以下に設定されているログは出力されません。

ログレベルを設定するにはadbのsetpropオプションを利用します。
以下のような書式でsetpropオプションで確認したいログのタグとログレベルを設定します。

adb setprop log.tag.[YOUR_LOG_TAG] [LEVEL]

たとえば、「MYAPP」というタグのデバッグログの優先度をDEBUGに変更するには以下のようすればOKです。

# adb shell stop
# adb shell setprop log.tag.MYAPP DEBUG
# adb shell start

処理速度比較

参考として、何も意識せずにログを表示し続けた場合、処理速度にどのくらい
影響が出るのか検証してみたいと思います。
ここでは少し極端な例ですが、単純にforループ内でLogを出力し、forループを抜けるまでにかかった時間を計測します。

long start = System.currentTimeMillis();

for (int i=0; i<65535; i++) {
        if (Log.isLoggable("MYAPP", Log.DEBUG)) {
        	Log.d("MYAPP", "log level is DEBUG");
        }
}

long end = System.currentTimeMillis();

Log.d("MYAPP", "計測: " + (end - start));

4行目でisLoggableメソッドを使ってログレベルでログの出力をコントロールできるようにしています。
上記コードを実行した結果が以下の表です。
adbコマンドのsetpropオプションでログ出力を有効にした場合と無効にした場合、
それぞれの平均を計測しました。

[table “210” not found /]

※Nexus Sで5回計測した平均値。単位はms

結果から分かるようにログ出力が有効な場合と無効な場合では5倍以上の差が出ており、
ログ出力の負荷が大きい事が分かります。

むやみやたらにログを出力してしまうと、思わぬ形でアプリケーションのパフォーマンスに影響を与えかねないので、
開発者の皆さんは注意するように心がけましょう。

One Comment