Logcatは、ADBまたはAndroid Studioの内蔵コンソールを介して利用可能な、リアルタイムでシステムメッセージやアプリケーションログを表示するためのAndroid SDKツールです。Android Developersによると、Logcatはシステムの全プロセスからメッセージを収集し、重要度レベルやタグでフィルタリングし、開発者がエラーの診断、コード実行の追跡、パフォーマンスの分析を行うことを可能にします。LogcatはAndroidアプリケーションのデバッグにおける主要な情報源です。
主要ポイント
Logcatは、すべてのプロセス(Linuxカーネル、system_server、アプリケーションを含む)が特定の形式でメッセージを書き込むAndroidシステムバッファです。Android SDKに含まれるlogcatツールはこのバッファを読み取り、リアルタイムでメッセージを表示します。Android 4.1(API 16)以降、Logcatへのアクセスは制限されています:アプリケーションは自身のログのみを読み取ることができ、システムログはデバッグアクセスを持つADBを介してアクセス可能です。
各Logcatメッセージには5つのフィールドがあります:日付と時刻、PID(プロセス識別子)、TID(スレッド識別子)、ログレベル、タグです。形式は固定されており、すべてのAndroidバージョンで同一です。これにより、IDEに依存せずにCI/CDパイプラインでのログフィルタリングにgrep、awk、sedユーティリティを使用できます。
ログは固定サイズのリングバッファに保存されます:main用256KB、system用256KB、events用256KB(Android 5+)です。バッファがオーバーフローすると、古いメッセージは削除されます。開発者はPROP logcat.sizeプロパティまたはデバイスの開発者オプションでバッファサイズを変更できます。
6つのレベルのロギングがメッセージの重要度を決定します。Androidは他のプラットフォームと同様の標準レベルを使用しますが、Logクラスに独自の定数名を持っています。適切なレベルを選択することで、ログを効率的にフィルタリングし、重要メッセージが二次的なメッセージに埋もれるのを防ぐことができます。
| レベル | 定数 | 目的 | デフォルト表示 |
|---|---|---|---|
| VERBOSE | Log.v | 最大限に詳細なデバッグ情報 | いいえ |
| DEBUG | Log.d | 開発者向けデバッグメッセージ | いいえ |
| INFO | Log.i | アプリケーション動作に関する情報メッセージ | はい |
| WARN | Log.w | 潜在的な問題に関する警告 | はい |
| ERROR | Log.e | 重大なエラーと例外 | はい |
| ASSERT | Log.wtf | 原則として発生すべきでないエラー | はい |
タグ(tag) — メッセージのソースを識別する最大23文字の文字列です。タグとしてクラス名やモジュール名を使用することを推奨します:MainActivity、AuthManager、NetworkModuleなど。これにより、アプリケーションの特定のコンポーネントごとにログをフィルタリングできます。チーム内の一貫性のために、別ファイルにタグ定数を作成するか、クラス名に基づいて自動的にタグを挿入するTimberライブラリを使用できます。
未処理の例外が発生すると、Androidは自動的にLogcatに完全なスタックトレースを書き込み、クラス、メソッド、コード行、コールチェーンを示します。クラッシュログには、例外タイプ(NullPointerException、RuntimeException)、メッセージ、クラッシュポイントからアプリケーションのエントリポイントまでの呼び出しシーケンスが含まれます。ユーザーデバイスからのクラッシュログ分析にはFirebase Crashlyticsが使用され、難読化マップ(Android用mapping.txt)とスタックトレースを同期します。
Android Studioは、View → Tool Windows → Logcat(Alt + 6)からアクセス可能なグラフィカルLogcatインターフェースを提供します。Logcatウィンドウはリアルタイムで更新され、接続されたデバイスのすべてのメッセージを表示し、一般ストリームから目的の情報を分離するための柔軟なフィルターを設定できます。
Log Levelドロップダウンは最小レベルでメッセージをフィルタリングします:WARNを選択すると、VERBOSE、DEBUG、INFOを非表示にして警告とエラーのみ表示します。検索フィールドではメッセージテキストやタグで検索可能 — 正規表現に対応しており、パターンによるメッセージ検索に便利です。
Saved FiltersはAndroid StudioのLogcatの強力な機能です。アプリケーションのタグ(tag:MyApp)とWARN+レベルのメッセージのみを表示するフィルターを作成できます。フィルターはセッション間で保存され、ドロップダウンリストから利用可能です。複数モジュールのプロジェクトでは、モジュールごとに個別のフィルターを作成してください。
# アプリケーションのログをフィルタリングするための式の例
tag:"MyApp" level:WARN # MyAppにはWARN+のみ
package:"com.mycompany" # パッケージの全ログ
-tag:"okhttp" # OkHttpのログを除外
LogcatログはSave to Fileアイコンからテキストファイルにエクスポートできます。これはJiraのチケットに添付したり、長時間のセッションを分析するのに便利です。エクスポートされたログは任意のテキストエディタで開き、grepを適用してパターンを検索できます。フォーマット表示にはlogcat-colorユーティリティを使用してください。
ADB logcatはLogcatのコンソール版で、Android Debug Bridgeを介してアクセスできます。その主な利点は、CIサーバー、自動化スクリプト、Android Studioのないデバイスで実行できることです。ADB logcatはGUIと同じすべてのフィルターをサポートしますが、コマンドラインの柔軟性を備えています。
adb logcatコマンドは引数なしでバッファ全体をリアルタイムで出力します。停止するにはCtrl+Cを使用します。-cフラグは記録開始前にバッファをクリアします — 現在のテストのログを以前のメッセージから分離する必要がある場合に便利です。-bフラグはバッファタイプを選択します:main、system、events、crash(Android 12+)。
# バッファをクリアしてMyAppタグでログ記録を開始
adb logcat -c
adb logcat MyApp:D *:S
# ログをファイルに保存
adb logcat -d > logcat_dump.txt
# プロセスPIDによるフィルタリング
adb logcat --pid=12345
ADBとUnixユーティリティの組み合わせにより最大の柔軟性が得られます。例えば、フィルター"*:S TAG:D"はTAGタグを持つDEBUGレベル以上のメッセージのみを表示し、それ以外をすべて非表示にします。例外のみを表示するにはgrep -i exceptionを使用します。エラー頻度を分析するには、タグ列にsort | uniq -cを適用します。
CIサーバーでは、UIテスト実行中の診断情報収集にLogcatが使用されます。典型的なパイプライン:テスト実行前にバッファをクリアし、テスト実行後にログダンプをビルド成果物として保存します。テストが失敗した場合、ログから失敗がANR、未処理の例外、またはネットワークタイムアウトのいずれによって引き起こされたかを判断できます。
android.util.Logクラスは、Logcatにメッセージを書き込むための組み込みAPIです。Log.v、Log.d、Log.i、Log.w、Log.e、Log.wtfはタグ(文字列)とメッセージ(文字列)、またはメッセージ+Throwableを受け取ります。メッセージの書式設定にはString.formatまたはKotlinの文字列テンプレートを使用してください — ヒープに不要なオブジェクトを生成する文字列連結は避けてください。
TimberはJake Whartonによる人気ライブラリで、組み込みLog APIの欠点を解消します。Timberはロギングを呼び出したクラス名に基づいて自動的にタグを挿入し、毎回の呼び出しでタグを渡す必要がありません。Timberは条件付きロギングもサポートしています:Releaseビルドでは、Application.onCreateの1行でTimber.vとTimber.dの呼び出しを無効にできます。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 組み込みLog API
Log.d("MainActivity", "onCreate called")
// Timber — クラス名による自動タグ
Timber.d("onCreate called")
}
private fun loadData() {
try {
val result = fetchFromNetwork()
Timber.i("Data loaded: $result")
} catch (e: IOException) {
Timber.e(e, "Failed to load data")
}
}
}
Releaseビルドでは、Logcatバッファの負荷を軽減し、機密情報の漏洩を防ぐために、VERBOSEおよびDEBUGログを無効にすることを推奨します。TimberはPlantingTreeを通じてこの問題を解決します:DebugフレーバーではDebugTreeが植えられ(すべてをログ記録)、ReleaseではCrashReportingTreeが植えられます(Crashlyticsを介してERRORのみをログ記録)。組み込みLog APIは条件付きロギングをサポートしていないため、開発者は各呼び出しをif(BuildConfig.DEBUG)でラップする必要があります。
よくある質問
テスト実行前にadb logcat -cコマンドを使用してください。または、Android StudioのLogcatウィンドウでClear Logcatボタン(ゴミ箱)をクリックします。クリアしても他のプロセスのシステムバッファには影響せず、現在の接続のみに影響します。
バッファを2MBに増やすにはadb logcat -G 2Mを実行します。最大サイズはデバイスに依存します:Android 10+では最大16MBまで利用可能です。変更はデバイスの再起動まで維持されます。永続的な設定には、device treeのbuild.propを使用してください。
考えられる原因:アプリケーションがReleaseモードで実行されている(Timber.v/dログが無効)、Logcatフィルターが必要なレベルを非表示にしている、または間違ったデバイスに接続している。また、Android Studioでアプリケーションのプロセスを選択しているか確認してください(system_processではありません)。
FATAL EXCEPTIONを含む行を見つけ、その下に完全なスタックトレースがあります。最初の行に例外タイプとメッセージが含まれ、後続の行にファイルとコード行を示す呼び出しチェーンが含まれます。すべてのログから素早く検索するにはgrep "FATAL EXCEPTION"を使用してください。
ANR(Application Not Responding)は、メインスレッド(UIスレッド)が5秒以上ブロックされる状況です。Logcatでは、ANRはActivityManagerタグと「ANR in ...」というテキストを持つメッセージとして表示され、すべてのスレッドのスタックトレースが添付されます。フィルターtag:ActivityManager level:ERRORを使用してください。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。