Logcat は、デバイスがエラーをスローしたときのスタック トレースや、Log
クラスを使用してアプリから書き込んだメッセージの送信など、システム メッセージのログをダンプするコマンドライン ツールです。
このページでは、logcat
コマンドライン ツールについて説明します。ログメッセージは、Android Studio の [Logcat] ウィンドウから表示することもできます。Android Studio からログの表示やフィルタリングを行う方法については、Logcat を使用してログを表示、書き込みするをご覧ください。
ログシステムの概要
Android のログシステムは、システム プロセス logd
によって管理される構造化されたサークル バッファのセットです。使用可能なバッファセットは、システムによって固定および定義されます。最も関連性の高いバッファは次のとおりです。
main
: ほとんどのアプリケーション ログを保存します。system
: Android OS によって生成されたメッセージを保存します。-
crash
: クラッシュログを保存します。各ログエントリは、優先度、ログの生成元を特定するタグ、実際のログメッセージで構成されます。
ログシステムへのプライマリ インターフェースは、共有ライブラリ liblog
とそのヘッダーの <android/log.h>
です。言語固有のすべてのログ機能は、最終的に関数 __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.MyApp
persist.log.tag.MyApp
log.tag
persist.log.tag
- アプリケーションのフィルタリング
- どのプロパティも設定されていない場合、
liblog
は__android_log_set_minimum_priority
によって設定された最小優先度を使用します。デフォルトの設定はINFO
です。 - 表示のフィルタリング
adb logcat
は、logd
から表示されるログの量を削減できる追加のフィルタをサポートしています。詳しくは、ログ出力をフィルタリングするのセクションをご覧ください。
コマンドラインの構文
adb
シェルから logcat
を実行する一般的な使用状況は次のとおりです。
[adb] logcat [<option>] ... [<filter-spec>] ...
logcat
は、adb
コマンドとして実行できます。または、エミュレータまたは接続されたデバイスのシェル プロンプトで直接実行することもできます。adb
を使用してログ出力を表示するには、SDK の platform-tools/
ディレクトリに移動して、次のコマンドを実行します。
adb logcat
logcat
のオンライン ヘルプを表示するには、デバイスを起動して、次のコマンドを実行します。
adb logcat --help
デバイスへのシェル接続を作成し、次のコマンドを実行します。
$ adb shell # logcat
オプション
logcat
のコマンドライン オプションの説明を次の表に示します。
オプション | 説明 |
---|---|
-b <buffer> |
events や radio など、表示する代替ログバッファを読み込みます。デフォルトでは、main 、system 、crash のバッファセットが使用されます。代替ログバッファの表示についてのセクションをご覧ください。 |
-c, --clear |
選択したバッファをクリアして終了します。デフォルトのバッファセットは、main 、system 、crash です。すべてのバッファをクリアするには、-b all -c を使用します。 |
|
ログメッセージが <expr> に一致した行に限り出力します(<expr> は正規表現)。 |
|
<count> の行数を出力した後に終了します。このオプションは、--regex と併用することが想定されていますが、単独でも機能します。 |
--print |
--regex および --max-count と併用することで、コンテンツは regex フィルタをバイパスするようになりますが、適切な一致数に達した時点で停止します。 |
-d |
ログを画面にダンプして終了します。 |
-f <filename> |
ログメッセージ出力を <filename> に書き込みます。デフォルト値は stdout です。 |
-g, --buffer-size |
指定したログバッファのサイズを出力して終了します。 |
-n <count> |
ローテーションするログの最大数を <count> に設定します。デフォルト値は 4 です。-r オプションが必要です。 |
-r <kbytes> |
<kbytes> の出力ごとにログファイルをローテーションします。デフォルト値は 16 です。-f オプションが必要です。 |
-s |
フィルタ式 '*:S' と同等で、すべてのタグの優先度をサイレントに設定し、コンテンツを追加するフィルタ式のリストの前に使用します。詳しくは、ログ出力をフィルタリングするのセクションをご覧ください。 |
-v <format> |
ログメッセージの出力形式を設定します。デフォルトは threadtime 形式です。サポートされている形式のリストについては、ログ出力形式の制御に関するセクションをご覧ください。 |
-D, --dividers |
各ログバッファ間のデバイダーを出力します。 |
-c |
ログ全体を消去して終了します。 |
-t <count> |
最新の行数だけを出力します。このオプションには -d 機能が含まれています。 |
-t '<time>' |
指定した時刻以降の最新の行を出力します。このオプションには -d 機能が含まれています。埋め込みスペースを持つパラメータを引用符で囲む方法については、-P オプションをご覧ください。adb logcat -t '01-26 20:52:41.820' |
-T <count> |
指定した時刻以降の最新の行数を出力します。このオプションには -d 機能は含まれません。 |
-T '<time>' |
指定した時刻以降の最新の行を出力します。このオプションには -d 機能は含まれません。埋め込みスペースを持つパラメータを引用符で囲む方法については、-P オプションをご覧ください。adb logcat -t '01-26 20:52:41.820' |
-L, --last |
最後の再起動の前のログをダンプします。 |
-B, --binary |
ログをバイナリで出力します。 |
-S, --statistics |
ログスパマーを識別してターゲティングできるように、出力に統計情報を追加します。 |
-G <size> |
ログ リングバッファのサイズを設定します。末尾に K や M を追加して、キロバイトやメガバイト単位で指定できます。 |
-p, --prune |
次のように、許可リストと拒否リストを出力します。引数は取りません。adb logcat -p |
-P '<list> ...'
|
許可リストと拒否リストを作成し、特定の目的に合わせてログコンテンツを調整します。許可リストと拒否リストのエントリを組み合わせて指定します。<allowlist> または <denylist> は、UID、UID/PID、PID のいずれかです。logcat 統計情報(logcat -S )に基づいて、以下のような目的に応じて許可リストと拒否リストを調整します。
ログシステムはデフォルトで、ログ統計情報内で最も邪魔なエントリを自動的に阻止して、新しいログメッセージのスペースを動的に確保します。このヒューリスティックの適用が完了すると、システムは、最も古いエントリをプルーニングして、新しいメッセージのスペースを確保します。 許可リストを追加すると、Android ID 番号(AID)が保護され、プロセスの AID と GID が「邪魔な ID」として宣言されることがなくなります。拒否リストを追加すると、最も邪魔なエントリを判断する前に、スペースを解放できます。プルーニングのレベルは選択可能です。また、プルーニングをオフにすると、各ログバッファの中で最も古いエントリのコンテンツだけを削除するように指定できます。 引用符
$ adb logcat -P '"<allowlist_and_denylist>"' or adb shell $ logcat -P '<allowlist_and_denylist>' PID 32676 と UID 675 を許可リストに登録し、PID 32677 と UID 897 を拒否リストに登録する例を以下に示します。拒否リストの PID 32677 は、早くプルーニングするために重み付けされています。 adb logcat -P '"/32676 675 ~/32677 897"' 次の許可リストと拒否リストのコマンド バリエーションを使用できます。 ~! worst uid denylist ~1000/! worst pid in system (1000) |
--pid=<pid> ... |
指定した PID からのログだけを出力します。 |
--uid=<uids> ... |
カンマ区切りリスト <uids> 内の UID からのログメッセージのみを表示します。名前の検索は行われないため、UID は数値として指定する必要があります。このオプションは「root」、「log」、「system」の各ユーザーにのみ有効です。これらのユーザーのみが他のユーザーのログを表示できることがその理由です。 |
--wrap |
2 時間が経過したときか、バッファがラップを開始しようとしたときのいずれか早いほうでスリープします。ラップ開始時ウェイクアップを指定することで、ポーリングの効率を改善できます。 |
ログ出力をフィルタする
ログメッセージのタグは、メッセージの送信元のシステム コンポーネントを示す短い文字列です(例: ビューシステムの場合は「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 ログメッセージには、タグと優先度が関連付けられています。形式修飾子は次の形式オプションのいずれかと組み合わせることができます。
brief
long
process
raw
tag
thread
threadtime
time
次の修飾子の詳細をフォーマットするには、コマンドラインで「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