Save the date! Android Dev Summit is coming to Mountain View, CA on November 7-8, 2018.

logcat コマンドライン ツール

Logcat は、Log クラスを使ってアプリから記述したメッセージやエラーを端末がスローしたときのスタックトレースなど、システム メッセージのログをダンプするコマンドライン ツールです。

このページでは、logcat コマンドライン ツールについて説明していますが、Android Studio の [Logcat] ウィンドウからログメッセージを表示することもできます。Android Studio からログを表示およびフィルタリングする方法の詳細については、Logcat でログを記述および表示するをご覧ください。

コマンドラインの構文

[adb] logcat [<option>] ... [<filter-spec>] ...

logcat は adb コマンドとして実行するか、エミュレータまたは接続されている端末のシェル プロンプトで直接実行することができます。adb を使用してログ出力を表示するには、SDK platform-tools/ ディレクトリに移動して、次のコマンドを実行します。

$ adb logcat

端末へのシェル接続を確立すると、次のコマンドを実行できます。

$ adb shell
# logcat

オプション

次の表では、logcat のコマンドライン オプションについて説明しています。

オプション 説明
-b <buffer> eventsradio など、表示する代替ログバッファを読み込みます。デフォルトでは、main バッファが使用されます。代替ログバッファの表示をご覧ください。
-c ログ全体をクリア(フラッシュ)して終了します。
-d ログを画面にダンプして終了します。
-f <filename> ログメッセージの出力を <filename> に書き込みます。デフォルトは stdout です。
-g 指定したログバッファのサイズを出力して終了します。
-n <count> ローテーションさせるログの最大数を <count> に設定します。デフォルト値は 4 です。-r オプションが必要です。
-r <kbytes> <kbytes> の出力ごとにログファイルをローテーションします。デフォルト値は 16 です。-f オプションが必要です。
-s デフォルトのフィルタ仕様を silent に設定します。
-v <format> ログメッセージの出力形式を設定します。デフォルトは brief 形式です。サポートされる形式の一覧については、ログ出力の形式の制御をご覧ください。

LogCat の開始

logcat を ADB シェルを介して実行するには、一般的に、次のコマンドを使用します。

[adb] logcat [<option>] ... [<filter-spec>] ...

開発コンピュータまたはエミュレータ / 端末インスタンスのリモート adb シェルから logcat コマンドを使用することができます。開発コンピュータでログ出力を表示するには、次のコマンドを使用します。

$ adb logcat

リモート adb シェルからログ出力を表示するには、次のコマンドを使用します。

# logcat

次の表では、logcat のコマンドライン オプションについて説明しています。

-c ログ全体をクリア(フラッシュ)して終了します。
-d ログを画面にダンプして終了します。
-f <filename> ログメッセージの出力を <filename> に書き込みます。デフォルトは stdout です。
-g 指定したログバッファのサイズを出力して終了します。
-n <count> ローテーションさせるログの最大数を <count> に設定します。デフォルト値は 4 です。-r オプションが必要です。
-r <kbytes> <kbytes> の出力ごとにログファイルをローテーションします。デフォルト値は 16 です。-f オプションが必要です。
-s デフォルトのフィルタ仕様を silent に設定します。
-v <format> ログメッセージの出力形式を設定します。デフォルトは brief 形式です。サポートされる形式の一覧については、ログ出力の形式の制御をご覧ください。

ログ出力のフィルタリング

すべての Android ログメッセージには、タグと優先度が関連付けられています。

  • ログメッセージのタグは、メッセージの送信元のシステム コンポーネントを示す短い文字列です(たとえば、ビュー システムの場合は "View")。
  • 優先度は次の文字値のいずれかです。低い優先度から高い優先度の順に示してます。
    • V - Verbose(最も低い優先度)
    • D - Debug
    • I - Info
    • W - Warning
    • E - Error
    • F - Fatal
    • S - Silent(最も高い優先度。何も出力されません)

logcat を実行して、各メッセージの最初の 2 つの列(<priority>/<tag>)を見ると、システムで使用されるタグと優先度のリストを確認できます。

次の例は、メッセージが優先度レベル "I" とタグ "ActivityManager" に関連していることを示す logcat 出力です。

I/ActivityManager(  585): Starting activity: Intent { action=android.intent.action...}

ログ出力を管理可能なレベルにまで削減するには、フィルタ式を使用してログ出力を制限します。フィルタ式を使用すると、タグと優先度の必要な組み合わせをシステムに示すことができます。そうすると、指定したタグの他のメッセージが表示されなくなります。

フィルタ式の形式は tag:priority ... です。ここで、tag は必要なタグを示し、priority はそのタグをレポートする最小レベルの優先度を示しています。そのタグの指定された優先度以上のメッセージがログに書き込まれます。1 つのフィルタ式で任意の数の tag:priority 仕様を指定することができます。一連の仕様は空白文字で区切られます。

次のフィルタ式の例では、優先度 "Info" 以上のタグ "ActivityManager" が付いたログメッセージと、優先度 "Debug" 以上のタグ "MyApp" が付いたログメッセージを除いて、すべてのログメッセージを非表示にします。

adb logcat ActivityManager:I MyApp:D *:S

上記の式の最後の要素 *:S はすべてのタグの優先度レベルを "silent" に設定するため、"ActivityManager" と "MyApp" が付いたログメッセージのみが表示されます。*:S の使用は、明示的に指定したフィルタによってログ出力を制限する効果的な方法です。つまり、フィルタがログ出力の「ホワイトリスト」として機能します。

次のフィルタ式は、あらゆるタグで優先度レベルが "warning" 以上のログメッセージをすべて表示します。

adb logcat *:W

開発コンピュータから logcat を実行している場合(リモート adb シェルからではなく)、環境変数 ANDROID_LOG_TAGS の値をエクスポートすることにより、デフォルトのフィルタ式を設定することもできます。

export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"

リモートシェルから logcat を実行している場合、または adb shell logcat を使用している場合は、ANDROID_LOG_TAGS フィルタがエミュレータ / 端末インスタンスにエクスポートされないことに注意してください。

ログ出力の形式の制御

ログメッセージには、タグと優先度に加えて、多数のメタデータ フィールドが含まれています。メッセージの出力形式を変更して、特定のメタデータ フィールドが表示されるようにすることができます。そのためには、-v オプションを使用して、サポートされる次の出力形式のいずれかを指定します。

  • brief - 優先度 / タグとメッセージ発行元プロセスの PID を表示します(デフォルトの形式)。
  • process - PID のみを表示します。
  • tag - 優先度 / タグのみを表示します。
  • raw - 生のログメッセージを表示します。他のメタデータ フィールドは表示されません。
  • time - 日付、起動時刻、優先度 / タグ、メッセージ発行元プロセスの PID を表示します。
  • threadtime - 日付、起動時刻、優先度、タグ、メッセージ発行元スレッドの PID および TID を表示します。
  • long - すべてのメタデータ フィールドを表示し、各メッセージの間に空行を入れます。

logcat を開始するときに、-v オプションを使用して必要な出力形式を指定することができます。

[adb] logcat [-v <format>]

次の例は、thread 出力形式でメッセージを生成する方法を示しています。

adb logcat -v thread

-v オプションで指定できる出力形式は 1 つだけであることに注意してください。

代替ログバッファの表示

Android のログシステムでは、複数のサークル バッファを用いてログメッセージを記録しますが、すべてのログメッセージがデフォルトのサークル バッファに送信されるわけではありません。その他のログメッセージを表示するには、logcat コマンドに -b オプションを付けて実行し、代替サークル バッファの表示をリクエストします。次の代替バッファが表示できます。

  • radio - 無線通信や電話に関連するメッセージが含まれるバッファを表示します。
  • events - イベントに関連するメッセージが含まれるバッファを表示します。
  • main - メイン ログバッファを表示します(デフォルト)。

-b オプションの使用方法は次のとおりです。

[adb] logcat [-b <buffer>]

次の例は、無線通信および電話に関連するメッセージが含まれるログバッファを表示する方法を示してします。

adb logcat -b radio

stdout と stderr の表示

デフォルトでは、Android システムは stdout および stderrSystem.out および System.err)への出力を /dev/null に送信します。Dalvik VM を実行しているプロセスでは、出力のコピーをログファイルに書き込むように設定することができます。その場合、システムは、優先度 I のログタグ stdout および stderr を使用して、メッセージをログに書き込みます。

この方法で出力するには、エミュレータ / 端末インスタンスの実行を停止してから、シェルコマンド setprop を使用して、出力のリダイレクトを有効にします。この操作を行う方法を次に示します。

$ adb shell stop
$ adb shell setprop log.redirect-stdio true
$ adb shell start

システムでは、エミュレータ / 端末インスタンスを終了するまで、この設定が保持されます。エミュレータ / 端末インスタンスでこの設定をデフォルトとして使用するには、端末の /data/local.prop にエントリを追加します。

コードからのログ

Log クラスを使用すると、コードにログエントリを作成して、logcat ツールで表示することができます。一般的なログメソッドは次のとおりです。

たとえば、次の呼び出しを使用します。

Log.i("MyActivity", "MyClass.getView() — get item number " + position);

logcat の出力は次のようになります。

I/MyActivity( 1557): MyClass.getView() — get item number 1