Logcat は Log クラスを使用してアプリから作成したメッセージなど、システム メッセージのログをダンプするコマンドライン ツールです。
このページでは、logcat コマンドライン ツールについて説明します。ログメッセージは、Android Studio の [Logcat] ウィンドウから表示することもできます。Android Studio からログの表示やフィルタリングを行う方法については、Logcat を使用してログを表示、書き込みするをご覧ください。
ログシステムの概要
Android のログシステムは、システム プロセス logd によって管理される構造化されたサークル バッファのセットです。使用可能なバッファセットは、システムによって固定および定義されます。最も関連性の高いバッファは次のとおりです。
main: ほとんどのアプリケーション ログを保存します。system: Android OS によって生成されたメッセージを保存します。-
crash: クラッシュログを保存します。各ログエントリは、優先度、ログの生成元を特定するタグ、実際のログメッセージで構成されます。
ログシステムへのプライマリ C/C++ インターフェースは、共有ライブラリ liblog とそのヘッダーの <android/log.h> です。言語固有のすべてのログ機能(android.util.Log を含む)は、最終的に関数 __android_log_write を呼び出します。この関数はデフォルトで、ソケットを使用してログエントリを logd に送信する関数 __android_log_logd_logger を呼び出します。API レベル 30 以降では、__android_set_log_writer を呼び出すことによってこのログ関数を変更できます。詳しくは、NDK のドキュメントをご覧ください。
adb logcat で表示されるログには次の 4 つのレベルのフィルタリングが行われます。
- コンパイル時のフィルタリング
- コンパイルの設定によっては、一部のログがバイナリから完全に削除される場合があります。たとえば、
Log.dの呼び出しを Java コードから削除するように ProGuard を構成できます。 - システム プロパティのフィルタリング
liblogは一連のシステム プロパティを照会し、logdに送信する最小優先度を決定します。ログにタグMyAppが付与されている場合は、以下のプロパティがチェックされます。これらのプロパティには、最小優先度の最初の文字(V、D、I、W、E、またはすべてのログを無効にするS)が含まれている必要があります。log.tag.MyApppersist.log.tag.MyApplog.tagpersist.log.tag- アプリケーションのフィルタリング
- どのプロパティも設定されていない場合、
liblogは__android_log_set_minimum_priorityによって設定された最小優先度を使用します。デフォルトの設定はINFOです。 - 表示のフィルタリング
adb logcatは、logdから表示されるログの量を削減できる追加のフィルタをサポートしています。詳しくは、ログ出力をフィルタリングするのセクションをご覧ください。
コマンドラインの構文
adb シェルから logcat を実行する一般的な使用方法は次のとおりです。
[adb] shell logcat [<option>] ... [<filter-spec>] ...
adb logcat の短縮形もありますが、これは adb shell logcat に拡張されます。
オプション
logcat にはさまざまなオプションがあります。使用できるオプションは、使用しているデバイスの OS のバージョンによって異なります。使用しているデバイスに固有の logcat のヘルプを表示するには、次のコマンドを実行します。
adb logcat --help
logcat は OS デベロッパーに加えアプリ デベロッパーも使用するツールであるため(アプリ デベロッパーは Android Studio を使用することが想定されます)、オプションの多くは root としてのみ使用できます。
ログ出力をフィルタする
ログメッセージのタグは、メッセージの送信元のシステム コンポーネントを示す短い文字列です(例: ビューシステムの場合は「View」)。
優先度は、以下のいずれかの文字値になります(優先度が低い順)。
V: Verbose(最も低い優先度)D: DebugI: InfoW: WarningE: ErrorF: FatalS: Silent(最も高い優先度。何も出力されません)
logcat を実行して、各メッセージの最初の 2 つの列(<priority>/<tag>)を見ると、システム内で使用されるタグと優先度のリストを確認できます。
logcat -v brief output コマンドで取得した簡潔な logcat 出力の例を以下に示します。出力は、メッセージが優先度レベル「I」とタグ「ActivityManager」に関連していることを示しています。
I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}
管理可能なレベルまでログ出力を削減するには、フィルタ式を使用してログ出力を制限します。フィルタ式を使用すると、対象となるタグと優先度の組み合わせをシステムに示すことができます。これにより、指定したタグが付いたメッセージのみが表示されるようになります。
フィルタ式は、tag:priority ... という形式になります。tag は対象のタグを示し、priority はそのタグをレポートする最小レベルの優先度を示しています。そのタグが付いたメッセージのうち、指定した優先度以上のメッセージがログに書き込まれます。1 つのフィルタ式で任意の数の tag:priority を指定できます。指定ごとに、空白文字で区切ります。
以下に示すフィルタ式の例の場合、タグ「ActivityManager」が付いたログメッセージのうち優先度が「Info」以上のものと、タグ「MyApp」が付いたログメッセージのうち優先度が「Debug」以上のものだけが表示され、他のログメッセージは非表示になります。
adb logcat ActivityManager:I MyApp:D *:S
上記の式に存在する最後の要素 *:S は、すべてのタグの優先度レベルを「Silent」に設定します。そのため、「ActivityManager」と「MyApp」のタグが付いたログメッセージだけが表示されます。*:S を使用すると、明示的に指定したフィルタによって、ログ出力が制限されます。*:S を使用すると、フィルタがログ出力の「許可リスト」として機能します。
注: シェルによっては、「*」の文字がシェルによって予約されます。このようなシェルを使用している場合は、フィルタ式を adb logcat
"ActivityManager:I MyApp:D *:S" のように引用符で囲みます。
次のフィルタ式を使用すると、タグに関係なく、優先度レベルが「Warning」以上のログメッセージがすべて表示されます。
adb logcat *:W
リモートの adb シェルで実行する代わりに、開発用コンピュータから logcat を実行している場合は、環境変数 ANDROID_LOG_TAGS の値をエクスポートして、デフォルトのフィルタ式を設定することもできます。
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
リモートシェルから logcat を実行している場合、または adb shell
logcat を使用している場合、ANDROID_LOG_TAGS フィルタはエミュレータ / デバイス インスタンスにエクスポートされません。
ログの出力形式を指定する
ログメッセージには、タグと優先度のほかに、いくつかのメタデータ フィールドが含まれています。メッセージの出力形式を変更して、特定のメタデータ フィールドを表示するように設定できます。これを行うには、-v オプションを使用して、サポートされている次の出力形式のいずれかを指定します。
brief: 優先度 / タグ、メッセージ発行元プロセスの PID を表示します。long: すべてのメタデータ フィールドを表示し、各メッセージを空行で区切ります。process: PID のみを表示します。raw: 未加工のログメッセージを表示します。他のメタデータ フィールドは表示しません。tag: 優先度とタグのみを表示します。thread:: 優先度、PID、メッセージ発行元スレッドの TID を表示する従来型の形式。threadtime(デフォルト): 日付、呼び出し時刻、優先度 / タグ、PID、メッセージ発行元スレッドの TID を表示します。time: 日付、呼び出し時刻、優先度 / タグ、メッセージ発行元プロセスの PID を表示します。
logcat を開始する際に、-v オプションを使用して必要な出力形式を指定します。
[adb] logcat [-v <format>]
thread 出力形式でメッセージを生成する方法を示す例を以下に示します。
adb logcat -v thread
-v オプションで指定できる出力形式は 1 つに限られますが、有効な修飾子は必要な数だけ指定できます。logcat は、有効でない修飾子を無視します。
形式修飾子
形式修飾子は logcat の出力を変更します。形式修飾子を指定するには、次のように -v オプションを使用します。
adb logcat -b all -v color -d
すべての Android ログメッセージには、タグと優先度が関連付けられています。形式修飾子は次の形式オプションのいずれかと組み合わせることができます。
brieflongprocessrawtagthreadthreadtimetime
次の修飾子の詳細をフォーマットするには、コマンドラインで「logcat -v --help」と入力します。
color: 各優先度を異なる色で表示します。descriptive: ログバッファ イベントの説明を表示します。この修飾子は、イベントログ バッファ メッセージにのみ影響し、他の非バイナリ バッファには影響しません。イベントの説明は、event-log-tags データベースから取得します。epoch: 1970 年 1 月 1 日を起点とする経過時間を秒単位で表示します。monotonic: 前回の起動時を起点とする経過時間を CPU 秒単位で表示します。printable: バイナリ ログコンテンツをエスケープします。uid: アクセス制御によって許可されている場合に、ログに記録されたプロセスの UID または Android ID を表示します。usec: マイクロ秒単位の精度で時刻を表示します。UTC: 時刻を UTC として表示します。year: 表示されている時刻に年を追加します。zone: 表示されている時刻にローカル タイムゾーンを追加します。
代替ログバッファを表示する
Android のログシステムは、複数のサークル バッファを使用してログメッセージを記録しますが、必ずしもすべてのログメッセージがデフォルト サークル バッファに送信されるわけではありません。追加分のログメッセージを表示するには、logcat コマンドに -b オプションを付けて実行し、代替サークル バッファの表示をリクエストします。以下の代替バッファを表示できます。
radio: 無線通信や電話に関連するメッセージが格納されるバッファを表示します。events: 解釈されたバイナリ システム イベント バッファ メッセージを表示します。main: メインのログバッファを表示します(デフォルト)。システムログ メッセージとクラッシュログ メッセージは含まれません。system: デフォルトのシステムログ バッファを表示します。crash: デフォルトのクラッシュログ バッファを表示します。all: すべてのバッファを表示します。default:main、system、crashの各バッファをレポートします。
-b オプションは次のように使用します。
[adb] logcat [-b <buffer>]
無線通信や電話に関連するメッセージを格納しているログバッファを表示する方法を示す例を以下に掲載します。
adb logcat -b radio
出力するバッファごとに -b フラグを複数指定するには、次のように入力します。
logcat -b main -b radio -b events
複数のバッファをカンマ区切りで指定する場合は、-b フラグを 1 つだけ指定します。次に例を示します。
logcat -b main,radio,events
コードから取得したログ
Log クラスを使用すると、コード内にログエントリを作成して、logcat ツールで表示できます。一般的なログ記録用メソッドは次のとおりです。
Log.v(String, String)(詳細)Log.d(String, String)(デバッグ)Log.i(String, String)(情報)Log.w(String, String)(警告)Log.e(String, String)(エラー)
たとえば、次の呼び出しを使用します。
Kotlin
Log.i("MyActivity", "MyClass.getView() — get item number $position")
Java
Log.i("MyActivity", "MyClass.getView() — get item number " + position);
logcat の出力は次のようになります。
I/MyActivity( 1557): MyClass.getView() — get item number 1