Logcat-Befehlszeilentool

Logcat ist ein Befehlszeilentool, das ein Log mit Systemmeldungen ausgibt, Nachrichten, die Sie aus Ihrer App mit dem Klasse Log.

Auf dieser Seite geht es um das logcat-Befehlszeilentool. Sie können sich aber auch Logs ansehen. im Fenster Logcat in Android Studio angezeigt. Für Informationen zum Anzeigen und Filtern von Protokollen aus Android Studio, Siehe Logs ansehen und schreiben mit Logcat

Logging-Systemübersicht

Das Android-Protokollierungssystem besteht aus einer Reihe strukturierter kreisförmiger Puffer, die vom System verwaltet werden. Prozess logd. Die Menge der verfügbaren Puffer wird festgelegt und vom System. Die wichtigsten Puffer sind:

  • main: Speichert die meisten Anwendungslogs.
  • system: Speichert Nachrichten, die aus dem Android-Betriebssystem stammen.
  • crash: Speichert Absturzprotokolle. Jeder Logeintrag hat eine Priorität, ein Tag, das den Ursprung des Protokolls und die eigentliche Lognachricht.

Die primäre C/C++-Schnittstelle zum Logging-System ist die gemeinsam genutzte Bibliothek liblog und der Header <android/log.h>. Alle sprachspezifischen Logging-Funktionen (einschließlich android.util.Log) schließlich die Funktion aufrufen, __android_log_write. Standardmäßig wird die Funktion __android_log_logd_logger zum Senden des Logeintrags an logd mit einem Socket. Ab API-Level 30 kann die Logging-Funktion durch folgenden Aufruf geändert werden: __android_set_log_writer Weitere Informationen finden Sie in der NDK-Dokumentation

Die von adb logcat angezeigten Logs werden auf vier Arten gefiltert:

Filterung nach Kompilierungszeit
Je nach Kompilierungseinstellungen können einige Logs aus dem Binärprogramm entfernt. ProGuard kann beispielsweise so konfiguriert werden, dass Aufrufe an Log.d aus dem Java-Code.
Filterung nach Systemeigenschaften
liblog fragt eine Reihe von Systemeigenschaften ab, um Bestimmen Sie den minimalen Schweregrad, der an logd gesendet werden soll. Wenn Ihre Logs das Tag MyApp enthält, wurden die folgenden Eigenschaften geprüft. Diese sollten folgende Eigenschaften enthalten: der erste Buchstabe des Mindestschweregrads (V, D, I, W, E oder S, um alle Logs zu deaktivieren):
  • log.tag.MyApp
  • persist.log.tag.MyApp
  • log.tag
  • persist.log.tag
Anwendungsfilter
Wenn keines der Attribute festgelegt ist, verwendet liblog die durch __android_log_set_minimum_priority Die Standardeinstellung ist INFO
Displayfilter
adb logcat unterstützt zusätzliche Filter, die die Die Anzahl der ab logd angezeigten Logs. Weitere Informationen finden Sie im Abschnitt zu Filterung der Logausgabe.

Befehlszeilensyntax

Im Allgemeinen wird Folgendes verwendet, um logcat über die adb-Shell auszuführen:

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

Es gibt auch eine Abkürzung für adb logcat, aber das wird einfach zu adb shell logcat.

Optionen

logcat hat viele Möglichkeiten. Welche Optionen verfügbar sind, hängt vom Betriebssystem ab. Version des verwendeten Geräts. Hilfe zu logcat für den auf Ihrem Gerät ausgeführt haben, führen Sie folgenden Befehl aus:

    adb logcat --help
    

Hinweis: logcat ist ein Tool für Betriebssystem- und App-Entwickler. App-Entwickler, die stattdessen Android Studio verwenden, sind viele der Optionen nur nutzbar als root.

Logausgabe filtern

Das Tag einer Protokollmeldung ist ein kurzer String, der die Systemkomponente angibt, in der Nachricht entsteht. Beispiel: „Ansehen“ für das View-System.

Die Priorität ist einer der folgenden Zeichenwerte, geordnet vom niedrigsten zum höchsten Wert Priorität:

    • V: Ausführlich (niedrigste Priorität)
    • D: Fehlerbehebung
    • I: Informationen
    • W: Warnung
    • E: Fehler
    • F: Schwerwiegend
    • S: Lautlos (höchste Priorität, wenn nichts gedruckt wird)
  • Führen Sie den folgenden Befehl aus, um eine Liste der im System verwendeten Tags mit Prioritäten zu erhalten: logcat und beobachten die ersten beiden Spalten jeder Nachricht, angegeben als <priority>/<tag>.

    Das folgende Beispiel zeigt eine kurze logcat-Ausgabe, die mit dem logcat -v brief output-Befehl. Die Ausgabe zeigt, dass sich die Nachricht auf Prioritätsstufe „I“ und tag "ActivityManager":

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

    Um die Logausgabe auf eine überschaubare Ebene zu reduzieren, beschränken Sie die Logausgabe mithilfe von filter Ausdrücke Mithilfe von Filterausdrücken können Sie dem System die Tag-Priorität die für Sie interessant sind. Das System unterdrückt andere Meldungen für die angegebenen Tags.

    Ein Filterausdruck folgt dem Format tag:priority ..., wobei tag das Tag von Interesse und priority das Minimum an Priorität für den Bericht zu diesem Tag. Nachrichten für dieses Tag mit oder über der angegebenen Priorität werden in das Log geschrieben. Geben Sie beliebig viele tag:priority-Spezifikationen in einem einzelnen Filterausdruck. Die Reihe der Spezifikationen ist durch Leerzeichen getrennt.

    Im Folgenden finden Sie ein Beispiel für einen Filterausdruck, der alle Logeinträge unterdrückt, außer diejenigen mit dem Tag "ActivityManager" mit Priorität „Info“ oder höher und die mit dem Tag „MeineApp“ mit der Priorität „Debug“ oder höher:

    adb logcat ActivityManager:I MyApp:D *:S
    

    Das letzte Element im vorherigen Ausdruck, *:S, legt die Prioritätsstufe für alle Tags auf „silent“, wodurch nur Meldungen mit „ActivityManager“ protokolliert werden und „MeineApp“ sind angezeigt. Mit *:S wird sichergestellt, dass die Logausgabe auf die explizit angegebenen Filter. Mit *:S können Ihre Filter als Zulassungsliste für die Logausgabe.

    Hinweis: In einigen Shells wird der "*" ist von der Shell reserviert. Wenn Sie eine solche Shell verwenden, setzen Sie den Filterausdruck in Anführungszeichen: adb logcat "ActivityManager:I MyApp:D *:S"

    Mit dem folgenden Filterausdruck werden alle Logeinträge mit der Prioritätsstufe „warning“ angezeigt und weiter oben für alle Tags:

    adb logcat *:W
    

    Wenn Sie logcat auf Ihrem Entwicklungscomputer statt auf einem Remote-adb-Shell können Sie auch einen Standardfilterausdruck festlegen, indem Sie einen Wert für die Umgebungsvariable ANDROID_LOG_TAGS:

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

    Der Filter „ANDROID_LOG_TAGS“ wurde nicht in den Emulator/das Gerät exportiert wenn Sie logcat über eine Remote-Shell ausführen oder adb shell logcat verwenden.

    Ausgabeformat der Kontrolllogs

    Logmeldungen enthalten neben dem Tag und der Priorität eine Reihe von Metadatenfeldern. Sie können Ausgabeformat für Nachrichten so ändern, dass ein bestimmtes Metadatenfeld angezeigt wird Gehen Sie dazu wie folgt vor: Verwenden Sie die Option -v und geben Sie eines der folgenden unterstützten Ausgabeformate an:

    • brief: Zeigt Priorität, Tag und PID des Prozesses an, der den angezeigt.
    • long: Zeigt alle Metadatenfelder an und trennt einzelne Nachrichten ohne Leerzeichen Linien.
    • process: Zeigt nur die PID an.
    • raw: Zeigt die Rohlognachricht ohne weitere Metadatenfelder an.
    • tag: Nur die Priorität und das Tag werden angezeigt.
    • thread: Ein Legacy-Format, bei dem die Priorität, die PID und die TID des Thread, von dem die Nachricht stammt.
    • threadtime (Standardeinstellung): Zeigt Datum, Aufrufzeit, Priorität Tag, PID und TID des Threads, von dem die Nachricht stammt.
    • time: Zeigt das Datum, die Aufrufzeit, die Priorität, das Tag und die PID des von dem die Nachricht ausgegeben wird.

    Wenn Sie logcat starten, geben Sie das gewünschte Ausgabeformat mithilfe der Methode Option -v:

    [adb] logcat [-v <format>]
    

    Das folgende Beispiel zeigt, wie Nachrichten in der thread-Ausgabe generiert werden. Format:

    adb logcat -v thread
    

    Mit der Option -v können Sie nur ein Ausgabeformat angeben. Sie haben jedoch beliebig viele Modifikatoren angeben, sofern sie sinnvoll sind. logcat werden irrelevante Modifikatoren ignoriert.

    Formatmodifikatoren

    Formatmodifikatoren ändern die logcat-Ausgabe. Um einen Formatmodifikator anzugeben, verwenden Sie die Option -v so:

    adb logcat -b all -v color -d
    

    Jede Android-Lognachricht hat ein Tag und eine Priorität. Sie können einen beliebigen Formatmodifikator mit einer der folgenden Formatoptionen kombinieren:

    • brief
    • long
    • process
    • raw
    • tag
    • thread
    • threadtime
    • time

    Um die folgenden Modifikatordetails zu formatieren, geben Sie logcat -v --help unter der Befehlszeile:

    • color: Zeigt jede Prioritätsstufe in einer anderen Farbe an.
    • descriptive: Zeigt Beschreibungen der Ereignisse des Protokollzwischenspeichers an. Dieser Modifikator wirkt sich auf das Ereignis aus Protokollzwischenspeichermeldungen und hat keine Auswirkungen auf die anderen nicht binären Zwischenspeicher. Das Ereignis Beschreibungen stammen aus der event-log-tags-Datenbank.
    • epoch: Zeigt die Zeit in Sekunden ab dem 1. Januar 1970 an.
    • monotonic: Zeigt die Zeit in CPU-Sekunden ab dem letzten Start an.
    • printable: Sorgt dafür, dass alle binären Logging-Inhalte maskiert werden.
    • uid: Wenn dies durch die Zugriffssteuerung erlaubt ist, wird die UID oder Android-ID des protokollierten Prozess.
    • usec: Zeigt die Zeit genau in Mikrosekunden an.
    • UTC: zeigt die Zeit als UTC an.
    • year: Fügt das Jahr zur angezeigten Zeit hinzu.
    • zone: Fügt die lokale Zeitzone zur angezeigten Zeit hinzu.

    Alternative Protokollzwischenspeicher ansehen

    Das Android-Protokollierungssystem speichert mehrere kreisförmige Zwischenspeicher für Protokollmeldungen. -Protokollmeldungen werden an den kreisförmigen Standardpuffer gesendet. Um zusätzliche Logeinträge anzuzeigen, Führen Sie den Befehl logcat mit der Option -b aus, um das Aufrufen eines wechselnden kreisförmigen Puffer. Sie können sich die folgenden alternativen Zwischenspeicher ansehen:

    • radio: Zeigt den Zwischenspeicher an, der Funk- und Telefoniefunktionen enthält Nachrichten.
    • events: Betrachtet die interpretierten Zwischenspeichernachrichten des binären Systems.
    • main: Zeigt den Hauptprotokollzwischenspeicher an (Standardeinstellung). Dieser enthält keine Elemente. System- und Absturzprotokollmeldungen.
    • system: Zeigt den Systemprotokollzwischenspeicher an (Standardeinstellung).
    • crash: Zeigt den Zwischenspeicher für Absturzprotokolle an (Standardeinstellung).
    • all: alle Zwischenspeicher werden angesehen.
    • default: Berichte main, system und crash Zwischenspeicher.

    Die Verwendung der Option -b sieht so aus:

    [adb] logcat [-b <buffer>]
    

    Hier ist ein Beispiel für das Aufrufen eines Protokollzwischenspeichers, der Funk- und Telefonienachrichten enthält:

    adb logcat -b radio
    

    So geben Sie mehrere -b-Flags für alle Zwischenspeicher an, die Sie ausgeben möchten: geben Sie Folgendes ein:

    logcat -b main -b radio -b events
    

    Geben Sie ein einzelnes -b-Flag mit einer durch Kommas getrennten Liste von Puffern an. Beispiel:

    logcat -b main,radio,events
    

    Aus Code protokollieren

    Mit der Klasse Log können Sie Logeinträge in Ihrem Code, die im logcat-Tool angezeigt werden. Zu den gängigen Protokollierungsmethoden gehören:

    Verwenden Sie beispielsweise den folgenden Aufruf:

    Kotlin

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

    Java

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

    Die Ausgabe von logcat sieht in etwa so aus:

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