Logcatでログを書く、見る

AndroidスタジオのLogcatウィンドウは、ガーバッグコレクション発生時などのシステムメッセージや、Logクラスでアプリに追加したメッセージなどを表示します。

興味のある情報だけを表示するために、フィルターの作成、メッセージに表示される情報量の変更、優先度の設定、アプリのコードによって生成されたメッセージのみの表示、ログの検索を行うことができます。 デフォルトでは、logcat は最も最近実行されたアプリに関連するログ出力のみを表示します。

アプリが例外をスローした場合、logcat にはメッセージと、コード行へのリンクを含む関連スタックトレースが表示されます。

Android Studio 2.2 では、実行ウィンドウに現在実行中のアプリのログメッセージも表示されます。 Logcat 出力の表示は設定できますが、Run ウィンドウは設定できません。

View your app logs

アプリのログメッセージを表示するには:

  1. デバイス上でアプリを構築し、実行します。
  2. [表示] > ツールウィンドウ > Logcat (またはツールウィンドウバーの Logcat をクリック)をクリックします。

Logcatウィンドウには、図1に示すように、ウィンドウ上部のドロップダウンリストで選択した、選択したアプリのログメッセージが表示されます。 Logcat ウィンドウ

デフォルトでは、logcat はデバイス上で実行されているアプリのログメッセージのみを表示します。 このデフォルトを変更するには、logcatメッセージをフィルタリングする方法を参照してください。

Logcatツールバーには、次のボタンがあります。 可視ログをクリアする

  • Scroll to the end : クリックすると、ログの一番下までジャンプして、最新のログメッセージを見ることができます。
  • スタックトレースを上へ 、スタックトレースを下へ : ログ内のスタックトレースを上下に移動し、印刷された例外に表示される後続のファイル名(およびエディタ内の対応する行番号)を選択するためにクリックします。 これは、ログ内のファイル名をクリックしたときと同じ動作です。
  • ソフトラップを使用 : 行の折り返しを有効にし、水平スクロールを防止します(ただし、折り返しのない文字列は水平スクロールを必要とします).
  • Print : logcatメッセージを印刷する場合はクリックします。 表示されるダイアログで印刷設定を選択した後、PDFに保存することを選択することもできます。 クリックするとログが消去され、logcatが再起動します。 Clear logcatボタンと異なり、これは以前のログメッセージを回復して表示するので、Logcatが応答しなくなり、ログメッセージを失いたくない場合に最も有用です。
  • Logcat header : 日付と時間を表示するかどうかなど、各ログキャットメッセージの外観をカスタマイズできます。
  • 画面キャプチャ : スクリーンショットをキャプチャするには、ここをクリックします。
  • Write log messages

    The Log classallows you can create log messages that appear in logcat. 一般に、優先順位の高いものから低いもの(または、最も冗長でないもの)へと並べられた以下のログメソッドを使用する必要があります。

    • Log.e(String, String) (error)
    • Log.w(String, String) (warning)
    • Log.i(String, String) (information)
    • Log.d(String, String) (debug)
    • Log.v(String, String) (verbose)

    より詳しい説明は Log class description にあるオプションのリストを見てほしい。

    開発中を除いて、アプリケーションに詳細なログを決してコンパイルしてはいけません。 デバッグ ログはコンパイルされますが、実行時に削除され、エラー、警告、および情報ログは常に保持されます。

    各ログ メソッドの最初のパラメーターは固有のタグで、これらの 2 番目のパラメーターはメッセージです。 システム・ログ・メッセージのタグは、メッセージが発信されたシステム・コンポーネントを示す短い文字列です (たとえば、ActivityManager)。 タグは、現在のクラスの名前など、役に立つと思われる任意の文字列にすることができます。

    良い習慣は、最初のパラメーターで使用する TAG 定数をクラスで宣言することです。 たとえば、次のように情報ログメッセージを作成するかもしれません:

    Kotlin

    private const val TAG = "MyActivity"...Log.i(TAG, "MyClass.getView() — get item number $position")

    Java

    private static final String TAG = "MyActivity";...Log.i(TAG, "MyClass.getView() — get item number " + position);

    Note: Tag names greater than 23 characters are truncated in the logcat output.

    Logcat message format

    あらゆる Android ログメッセージにはタグとそれに付随する優先度が存在します。 システムログメッセージのタグは、メッセージが発信されたシステムコンポーネントを示す短い文字列です(たとえば、ActivityManagerなど)。 ユーザー定義のタグは、現在のクラスの名前 (推奨タグ) など、役に立つと思われる文字列であれば何でもかまいません。 例えば、Logメソッドコールで定義します:

    Kotlin

    Log.d(tag, message)

    Java

    Log.d(tag, message);

    priorityは以下の値のいずれかです:

    • V:Verbose(最も優先度が低い)
    • D:Verbose(最も優先度が低い) D:Verbose(最も優先度が高い) D:Verbose(最も優先度が低い)
    • I: Info
    • W: Warning
    • E: Error
    • A: Assert

    Log message format is:

    date time PID-TID/package priority/tag: message

    例えば、以下のログメッセージは優先度がV、タグはAuthZenです:

    12-10 13:02:50.071 1901-4229/com.google.android.gms V/AuthZen: Handling delegate intent.

    PID はプロセス識別子、TID はスレッド識別子を意味し、単一スレッドの場合は同じにすることが可能です。

    Set the log level

    ログレベルを設定することで、logcatに表示されるメッセージ数を制御することができます。 すべてのメッセージを表示することも、最も深刻な状態を示すメッセージのみを表示することも可能です。 設定は、logcat が何を表示するかを決定するだけです。

    Log level メニューで、次の値のいずれかを選択します。

    • Verbose。 すべてのログメッセージを表示します(デフォルト)。
    • Debug: このリストの下位のメッセージレベルと同様に、開発中にのみ有用なデバッグログメッセージを表示します。
    • Info: 通常の使用で期待されるログメッセージと、このリストの下位のメッセージレベルを表示します。
    • 警告: まだエラーではない可能性のある問題、およびこのリストの下位のメッセージレベルを表示します。
    • エラー: エラーを発生させた問題、およびこのリストの下位のメッセージレベルを表示します。
    • アサートします。 開発者が決して起こってはならないと予想している問題を表示します。

    Search logcat messages

    logcat に現在表示されているメッセージを検索するには:

    1. 正規表現の検索パターンを使用する場合は、オプションで Regex を選択します。
    2. 検索フィールド に文字列を入力します。

      それに伴い、logcatの出力表示が変わります。

    3. Enterキーを押すと、このセッション中に検索文字列がメニューに保存されます。
    4. 検索を繰り返すには、検索メニューから選択します。 必要に応じてRegexを選択または選択解除してください(設定は記憶されません)。

    Filter logcat messages

    ログ出力を管理可能なレベルまで減らす 1 つの方法は、フィルタを使用して制限することです。

    注: このフィルタは、現在 logcat で表示されているメッセージだけではなく、すべての logcat の履歴に適用されます。

    フィルターを定義し適用するには:

    1. フィルターメニューで、フィルターオプションを選択します。
      • 選択したアプリケーションのみを表示します。 アプリのコードによって生成されたメッセージのみを表示します(デフォルト)。 Logcatは、アクティブなアプリのPIDを使用してログメッセージをフィルタリングします。
      • フィルタなし。 フィルタを適用しません。 Logcatは、どのプロセスを選択したかにかかわらず、デバイスからのすべてのログメッセージを表示します。
      • フィルタ構成を編集します。 カスタムフィルタを作成または変更します。 たとえば、2つのアプリからのログメッセージを同時に表示するフィルターを作成することができます。

      フィルターを定義した後、メニューでそれらを選択することもできます。 メニューから削除する場合は、削除してください。

    2. Edit Filter Configurationを選択した場合、フィルタを作成または変更します。
      1. 新規Logcatフィルタの作成ダイアログでフィルタパラメータを指定します。
        • フィルタ名: 定義したいフィルタの名前を入力するか、既存のフィルタを変更するために左ペインでそれを選択します。 名前には、小文字、アンダースコア、および数字のみを含めることができます。
        • Log Tag:ログタグ。 オプションでタグを指定します。 詳細については、「logcatメッセージ形式」を参照してください。
        • Log Message:ログメッセージを指定します。 オプションでログメッセージテキストを指定します。 詳細については、logcatメッセージの形式を参照してください。
        • パッケージ名:オプションでパッケージ名を指定します。 オプションでパッケージ名を指定します。 詳細については、logcatメッセージの形式を参照してください。
        • PID: オプションでプロセスIDを指定します。 詳細については、「logcatメッセージの形式」を参照してください。
        • ログレベル: オプションでログレベルを指定します。 オプションでログレベルを選択します。 詳細については、「ログレベルの設定」を参照してください。
        • Regex: このオプションを選択すると、そのパラメータに正規表現構文が使用されます。
      2. +をクリックすると、フィルタ定義が左ペインに追加されます。

        フィルタを削除するには、左ペインでフィルタを選択し、-をクリックします。

      3. 完了したら、[OK]をクリックします。

      必要なログメッセージが表示されない場合、[フィルタなし]を選択して特定のログメッセージを検索してみてください。

      Read garbage collection messages

      ガベージコレクションイベントが発生すると、ログキャストに出力されることがあります。

      For more details about your app’s memory, use theMemory Profiler.

      Dalvik log messages

      In Dalvik (but not ART), every GC to logcat.

      D/dalvikvm(PID): GC_Reason Amount_freed, Heap_stats, External_memory_stats, Pause_time

      例:

      D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms

      GC Reason What triggered the GC and what kind of collection it is. 表示される可能性のある理由は次のとおりです。 GC_CONCURRENT ヒープが一杯になり始めたので、メモリを解放する同時実行 GC です。 GC_FOR_MALLOC GC は、ヒープがすでに一杯のときにアプリケーションがメモリを割り当てようとしたため、システムがアプリケーションを停止してメモリを再要求しなければならなかったために発生しました。 GC_HPROF_DUMP_HEAP ヒープを解析するために HPROF ファイルを作成するように要求したときに発生した GC です。 GC_EXPLICIT gc() を呼び出したときのような明示的な GC (これは呼び出さないようにして、代わりに必要なときに実行される GC を信頼すべきです)。 GC_EXTERNAL_ALLOC これは API レベル 10 以下でのみ発生します (より新しいバージョンでは Dalvikheap 内のすべてを割り当てます)。 外部で割り当てられたメモリ(ネイティブメモリやNIOバイトバッファに格納されたピクセルデータなど)のGC。 解放された量 この GC から再生されたメモリの量。 ヒープ統計 ヒープの空き割合と(ライブオブジェクトの数)/(ヒープサイズ合計)。 外部メモリ統計 APIレベル10以下の外部割り当てメモリ(割り当てメモリ量)/(収集が発生する限界値)。 一時停止時間 ヒープが大きいほど、一時停止時間が長くなります。 同時一時停止時間は、2つの一時停止を示します。1つはコレクションの開始時、もう1つは終了時の近くです。

      これらのログ・メッセージが蓄積される間、ヒープ統計の増加(上記の例では3571K/9991Kの値)に注目します。

      ART ログ メッセージ

      Dalvik とは異なり、ART では、明示的に要求されていない GC のメッセージは記録されません。 GC は、遅いと判断された場合にのみプリントされます。 より正確には、GC の一時停止が 5ms を超えるか、GC の継続時間が 100ms を超える場合です。 アプリが一時停止を感知できる状態でない場合(アプリがバックグラウンドにある場合など、ユーザーがGCの一時停止を感知できない場合)、そのアプリのGCはいずれも遅いとは判断されません。 明示的な GC は常にログに記録されます。

      ART は、ガベージ コレクション ログ メッセージに次の情報を含めます。 表示される可能性のある理由は次のとおりです。 Concurrent アプリ スレッドを一時停止しない同時実行 GC です。 この GC はバックグラウンド スレッドで実行され、割り当てを妨げません。 Alloc GC は、ヒープがすでに一杯のときにアプリケーションがメモリを割り当てようとしたために開始されました。 この場合、ガベージコレクションは割り当て中のスレッドで発生しました。 Explicit ガベージコレクションは、たとえば、gc() または gc() を呼び出すことによって、アプリによって明示的に要求されました。 Dalvik と同様に、ART では、GC を信頼し、可能であれば明示的な GC の要求を避けることが最良の方法です。明示的な GC は、割り当てスレッドをブロックし、不必要に CPU サイクルを浪費するので推奨されません。 明示的なGCは、他のスレッドがプリエンプトされる場合、ジャンク(アプリの吃音、ジャダー、停止)を引き起こす可能性もあります。 NativeAlloc Bitmap や RenderScript のアロケーション オブジェクトのようなネイティブのアロケーションによるメモリ圧迫が原因で、収集が発生しました。 CollectorTransition コレクションはヒープ遷移によって引き起こされました。これは、実行時に GC 戦略を変更することによって引き起こされます (アプリが一時停止可能な状態間で変更された場合など)。 コレクター遷移は、すべてのオブジェクトをフリーリストでバックアップされた空間からバンプポインタ空間にコピーします (またはその逆)。

      これは、Android 8 より前の低 RAM デバイスでのみ発生します。0 アプリが一時停止可能な状態 (アプリがフォアグラウンドにあり、ユーザーが GC ポーズを感知できる場合など) から一時停止不可能な状態 (またはその逆) にプロセス状態を変更した場合。

      HomogeneousSpaceCompact 均質空間圧縮は、フリーリスト空間からフリーリスト空間の圧縮で、通常アプリが一時停止不可能なプロセス状態に移行したときに発生します。 これを行う主な理由は、RAM 使用量の削減とヒープのデフラグメント化です。 DisableMovingGc これは実際の GC 理由ではなく、同時ヒープ圧縮が発生している間に、GetPrimitiveArrayCritical の使用により収集がブロックされたことを示すものです。 一般に、GetPrimitiveArrayCritical の使用は、コレクターの移動に対する制限のため、強く推奨されません。 HeapTrim これは GC 理由ではなく、ヒープ・トリムが終了するまでコレクションがブロックされたことを示すものです。 GC名 ARTは、実行されることができる様々な異なるGCを持っています。 Concurrent mark sweep (CMS) ヒープ全体のコレクタで、イメージ空間以外のすべての空間を解放します。 Concurrent partial mark sweep イメージ空間と接合部空間以外のすべての空間を回収する、ほぼ全ヒープ回収装置。 Concurrent sticky mark sweep 最後の GC 以降に割り当てられたオブジェクトのみを解放する世代別コレクタ。 このガーバッグコレクションは完全または部分的なマークスイープよりも高速で休止時間が短いため、より頻繁に実行される。 Marksweep + semispace ヒープ遷移と均質なスペースコンパクション (ヒープのデフラグメント) に使用される非同時コピー GC です。 オブジェクトの解放 このGCから非ラージオブジェクト空間から回収されたオブジェクトの数。 解放されたサイズ 非大規模なオブジェクト空間から、このGCから回収されたバイトの数。 ラージオブジェクト解放 このgarbagecollectionから回収されたラージオブジェクト空間内のオブジェクトの数。 解放されたラージオブジェクトのサイズ この Garbagecollection から再要求されたラージオブジェクト空間のバイト数です。 ヒープ統計値 解放された割合と(ライブ オブジェクトの数)/(ヒープ サイズの合計)。 一時停止時間 一般的に一時停止時間は、GCが実行されている間に変更されたオブジェクト参照の数に比例します。 現在、ART CMS GCは、GCの終わり近くに、1つのポーズを持っているだけです。移動GCは、GC期間の大部分にわたって続く長いポーズを持っています。

      logcat で大量の GC を見ている場合、ヒープ統計の増加(上記の例では 25MB/38MB 値)を探します。 この値が増加し続け、小さくなっていないようであれば、メモリーリークが発生している可能性があります。 あるいは、もしあなたが “Alloc” という理由で GC を見ているなら、あなたはすでにヒープ容量の近くで動作しており、近い将来にOOM例外が発生することが予想されます。

    コメントを残す

    メールアドレスが公開されることはありません。