LogLevelとLogCat
EclipseのADTプラグインにはLogCatというウインドウが付属しており(というより、Eclipse上でなくとも使用できる模様)、 AndroidのAPIやアプリケーションの出力したログを表示することができるのだが、これが非常にわかりづらい。
LogCatの操作
LogCat画面の右上の方に、V, D, I, W, E等のアイコンと+, 紙, -等のアイコン、紙に☓印のアイコンがあるが、これらの機能は 以下のようである。
- V, D, I, W, Eのアイコン:いずれかのログレベルを一つだけを選択でき、そのログレベル以上のログを表示する、つまりフィルタリングする。例えば、Iを選択すると、I, W, Eの出力のみを表示し、V, Dは無視される。
- +, 紙, -のアイコン:独自のフィルタを作成して、それだけを表示する新たなタブが作成される。例えば、特定のタグの特定のレベル以上のログのみを表示することができる。
- 紙に☓印のアイコン:ログをクリアする。
これらは、アプリケーションがどのようなログを出力するかには一切影響を与えない。LogCatの行うことは、単純に「出力されたものをフィルタリングして表示する」だけになる。
Vアイコンをクリックすれば、アプリ側がVERBOSEレベル以上のログを出力することになるわけでは全く無い。LogCat画面の制御とアプリ側がどのレベルのログを出力するかは全く無関係である。
アプリ側のログ出力
アプリ側では、例えば以下のようにしてVERBOSEあるいはDEBUGレベルのログを出力することができる。
Log.v(tag, "this is VERBOSE log"); Log.d(tag, "this is DEBUG log");
しかし、このような書き方をしてはいけない。これでは常にこれらのレベルが出力されてしまうことになる。 以下のように記述して、不要なログ出力を抑える必要がある。
if (Log.isLoggable(tag, Log.DEBUG) { Log.d(tag, "this is DEBUG log"); }
ログレベルの制御
アプリ側にどのレベルのログを出力させるかは、エミュレータ(実機も?)に指示しておく必要がある。 この指示の無い場合に、出力されるログはinfoレベル以上つまりI, W, Eである。
例えば、特定のタグについてDEBUG以上のログを出力させる場合は、adbにて
adb shell setprop log.tag.TAG DEBUG
と指示する必要がある(面倒だが、Eclipse ADT上でこれを制御する方法は見つからない)。
ただし、このログレベルの制御はあくまでも、前述のようにLog.isLoggableを使用している場合である。 これを使用せずに、
Log.d(tag, "this is DEBUG log");
と記述した場合には、この指定に関わらず出力されてしまう。