Maybaygiare.org

Blog Network

Logcat-Befehlszeilentool

Logcat ist ein Befehlszeilentool, das ein Protokoll von Systemmeldungen ablegt, einschließlich Stack-Traces, wenn das Gerät einen Fehler auslöst, und Nachrichten, die Sie aus Ihrer App mit derLog -Klasse geschrieben haben.

Auf dieser Seite geht es um das Befehlszeilen-Logcat-Tool, aber Sie können Logmessages auch über das Logcat-Fenster in Android Studio anzeigen. Informationen zum Anzeigen und Filtern von Protokollen aus Android Studio finden Sie unter Protokolle mit Logcat schreiben und anzeigen.

Übersicht über das Protokollierungssystem

Das Android-Protokollierungssystem besteht aus einer Reihe strukturierter kreisförmiger Puffer, die vom Systemprozess logd verwaltet werden. Die Menge der verfügbaren Puffer wird vom System festgelegt und definiert. Die wichtigsten sind: main, in dem die meisten Anwendungsprotokolle gespeichert sind, system, in dem Nachrichten gespeichert sind, die vom Android-Betriebssystem stammen, und crash, in dem Absturzprotokolle gespeichert sind. Jeder Protokolleintrag hat eine Priorität (eine von VERBOSEDEBUGINFOWARNINGERROR oder FATAL), ein Tag, das den Ursprung des Protokolls und die tatsächliche Protokollnachricht identifiziert.

Die primäre Schnittstelle zum Logging-System ist die Shared library liblog und deren Header <android/log.h>. Alle sprachspezifischen Protokollierungsfunktionen rufen schließlich die Funktion __android_log_write auf. Standardmäßig wird die Funktion __android_log_logd_logger aufgerufen, die den Protokolleintrag über einen Socket an logd sendet. Ab API Level 30 kann die Logging-Funktion durch Aufruf von __android_set_log_writer geändert werden. Weitere Informationen finden Sie in der NDK-Dokumentation.

Protokolle, die von adb logcat angezeigt werden, durchlaufen vier Filterstufen:

  1. Filterung zur Kompilierungszeit: Abhängig von den Kompilierungseinstellungen können einige Protokolle vollständig aus der Binärdatei entfernt werden. Beispielsweise kann Proguard so konfiguriert werden, dass Aufrufe von Log.d aus Java-Code entfernt werden.
  2. Systemeigenschaftsfilterung: liblog fragt eine Reihe von Systemeigenschaften ab, um den minimalen Schweregrad zu bestimmen, der an logd gesendet werden soll. Wenn Ihre Protokolle das Tag MyApp haben, werden die folgenden Eigenschaften überprüft und enthalten voraussichtlich den ersten Buchstaben des Mindestschweregrads (VDIWE oder S, um alle Protokolle zu deaktivieren):
  • log.tag.MyApp
  • persist.log.tag.MyApp
  • log.tag
  • persist.log.tag
  • Anwendungsfilterung: Wenn keine der Eigenschaften festgelegt ist, verwendet liblog die von __android_log_set_minimum_priority festgelegte Mindestpriorität. Die Standardeinstellung ist INFO.
  • Anzeigefilterung: adb logcat unterstützt zusätzliche Filter, die die Anzahl der angezeigten Protokolle von logd reduzieren können. Siehe unten für Details.
  • Befehlszeilensyntax

    Um logcat über die adb-Shell auszuführen, ist die allgemeine Verwendung:

     logcat ... ...

    Sie können logcat als adb-Befehl oder direkt in einer Shell-Eingabeaufforderung Ihres Emulators oder angeschlossenen Geräts ausführen. Um die Protokollausgabe mit adb anzuzeigen, navigieren Sie zu Ihrem SDK platform-tools/ Verzeichnis und führen Sie Folgendes aus:

    adb logcat

    Für logcat Online-Hilfe, starten Sie ein Gerät und führen Sie dann Folgendes aus:

    adb logcat --help

    eine Shell-Verbindung zu einem Gerät herstellen und ausführen:

    $ adb shell# logcat

    Optionen

    Die folgende Tabelle beschreibt die Befehlszeilenoptionen von logcat.

    Option Beschreibung
    -b <buffer> Laden Sie einen alternativen Protokollpuffer zur Anzeige, z. B. events oder radio. Der Puffersatz mainsystem und crash wird standardmäßig verwendet. Siehe Anzeigen alternativer Protokollpuffer.
    -c, --clear Löschen Sie die ausgewählten Puffer und beenden Sie sie. Der Standardpuffersatz ist mainsystem und crash. Um alle Puffer zu löschen, verwenden Sie -b all -c .
    -e <expr>, --regex=<expr> Gibt nur Zeilen aus, in denen die Protokollnachricht mit <expr> übereinstimmt, wobei <expr> ein regulärer Ausdruck ist.
    -m <count>, --max-count=<count> Beenden nach dem Drucken <count> Anzahl der Zeilen. Dies soll mit --regex gepaart werden, funktioniert aber von selbst.
    --print Gepaart mit --regex und --max-count, um den Inhalt den Regex-Filter umgehen zu lassen, aber immer noch bei der richtigen Anzahl von Übereinstimmungen anzuhalten.
    -d Speichern Sie das Protokoll auf dem Bildschirm und beenden Sie es.
    -f <filename> Schreiben Sie die Protokollnachrichtenausgabe an <filename>. Der Standardwert ist stdout.
    -g, --buffer-size Gibt die Größe des angegebenen Protokollpuffers aus und wird beendet.
    -n <count> Legen Sie die maximale Anzahl gedrehter Protokolle auf <count> fest. Der Standardwert ist 4. Erfordert die -r Option.
    -r <kbytes> Drehen Sie die Protokolldatei alle <kbytes> der Ausgabe. Der Standardwert ist 16. Erfordert die -f Option.
    -s Entspricht dem Filterausdruck '*:S', der die Priorität für alle Tags auf silent setzt und einer Liste von Filterausdrücken vorangestellt wird, die Inhalt hinzufügen. Weitere Informationen finden Sie im Abschnitt zum Filtern der Protokollausgabe.
    -v <format> Legen Sie das Ausgabeformat für Protokollnachrichten fest. Der Standardwert ist threadtime Format. Eine Liste der unterstützten Formate finden Sie im Abschnitt über das Control Log-Ausgabeformat.
    -D, --dividers Drucken Sie Teiler zwischen jedem Protokollpuffer.
    -c Leeren (löschen) Sie das gesamte Protokoll und beenden Sie es.
    -t <count> Gibt nur die letzte Zeilenzahl aus. Diese Option beinhaltet -d Funktionalität.
    -t '<time>' Gibt die letzten Zeilen seit der angegebenen Zeit aus. Diese Option beinhaltet -d Funktionalität. Informationen zum Zitieren von Parametern mit eingebetteten Leerzeichen finden Sie in der Option -P.

    adb logcat -t '01-26 20:52:41.820'
    -T <count> Gibt die letzte Zeilenzahl seit der angegebenen Zeit aus. Diese Option beinhaltet nicht -d Funktionalität
    -T '<time>' Drucken Sie die letzten Zeilen seit der angegebenen Zeit. Diese Option enthält keine include -d -Funktionalität. Informationen zum Zitieren von Parametern mit eingebetteten Leerzeichen finden Sie in der Option -P.

    adb logcat -t '01-26 20:52:41.820'
    -L, -last Dump der Protokolle vor dem letzten Neustart.
    -B, --binary Gibt das Protokoll binär aus.
    -S, --statistics Fügen Sie Statistiken in die Ausgabe ein, um Protokoll-Spammer zu identifizieren und darauf abzuzielen.
    -G <size> Legen Sie die Größe des Protokollringpuffers fest. Kann am Ende K oder M hinzufügen, um Kilobyte oder Megabyte anzugeben.
    -p, --prune Drucken (lesen) Sie die aktuellen Listen allow (white) und deny (black) und akzeptieren Sie keine Argumente wie folgt:

    adb logcat -p
    -P '<list> ...'
    --prune '<list> ...' -P '<white_and_black_list>'
    Schreiben (setzen) Sie die Listen allow (white) und deny (black), um den Protokollierungsinhalt für einen bestimmten Zweck anzupassen. Sie geben einen gemischten Inhalt von erlaubten (<white>) und verweigerten (~<black>) Listeneinträgen an, wobei <white> oder <black> eine UID, UID/PID oder /PID sein kann. Unter Anleitung der Logcat-Statistiken (logcat -S) können Anpassungen der Listen allow (white) und deny (black) für folgende Zwecke in Betracht gezogen werden:

    • Geben Sie bestimmten Protokollierungsinhalten durch UID-Auswahl die höchste Langlebigkeit.
    • Verhindern Sie, dass jemand (UID) oder etwas (PID) diese Ressourcen verbraucht, um den Logspan zu erhöhen, damit Sie mehr Einblick in die Probleme haben, die Sie diagnostizieren.

    Standardmäßig verhindert das Logging-System automatisch den schlimmsten Täter in der Log-Statistik dynamisch, um Platz für neue Log-Meldungen zu schaffen. Sobald die Heuristik erschöpft ist, beschneidet das System die ältesten Einträge, um Platz für die neuen Nachrichten zu schaffen.

    Das Hinzufügen einer Allowlist (whitelist) schützt Ihre Android-Identifikationsnummer (AID), die zur AID und GID der Prozesse wird, davor, zum Täter erklärt zu werden, und das Hinzufügen einer Denylist hilft, Speicherplatz freizugeben, bevor die schlimmsten Täter in Betracht gezogen werden. Sie können wählen, wie aktiv das Beschneiden ist, und Sie können das Beschneiden deaktivieren, sodass nur Inhalte aus den ältesten Einträgen in jedem Protokollpuffer entfernt werden.

    Anführungszeichen

    adb logcat behält die Anführungszeichen nicht bei, daher lautet die Syntax für die Angabe von allow (white) und deny (black) Listen wie folgt:

    $ adb logcat -P '"<white_and_blacklist>"'oradb shell$ logcat -P '<white_and_blacklist>'

    Das folgende Beispiel gibt eine Liste allow (white) mit der PID 32676 und der UID 675 und eine Liste deny (black) mit der PID 32677 und der UID 897 an. Die PID 32677 auf der Denylist wird zum schnelleren Beschneiden gewichtet.

    adb logcat -P '"/32676 675 ~/32677 897"'

    Andere erlauben (white) und verweigern (black) liste befehl variationen, die Sie verwenden können, sind wie folgt:

    ~! worst uid blacklist~1000/! worst pid in system (1000)
    --pid=<pid> ... Gibt nur Protokolle der angegebenen PID aus.
    --wrap Schlafen Sie für 2 Stunden oder wenn der Puffer kurz vor dem Umbrechen steht, je nachdem, was zuerst eintritt. Verbessert die Effizienz der Abfrage, indem ein kurz vor dem Umbruch stehendes Aufwecken bereitgestellt wird.

    Protokollausgabe filtern

    • Das Tag einer Protokollnachricht ist eine kurze Zeichenfolge, die die Systemkomponente angibt, von der die Nachricht stammt (z. B. „View“ für das View-System).
    • Die Priorität ist einer der folgenden Zeichenwerte, geordnet von der niedrigsten zur höchsten Priorität:
      • V: Verbose (niedrigste Priorität)
      • D: Debug
      • I: Informationen
      • W: Warnung
      • E: Fehler
      • F: Fatal
      • S: Silent (höchste Priorität, auf der nie etwas gedruckt wird)

    Sie können eine Liste der tags, die im System mit Prioritäten verwendet werden, indem logcat ausgeführt und die ersten beiden Spalten jeder Nachricht beobachtet werden, angegeben als <priority>/<tag>.

    Das Folgende ist ein Beispiel für eine kurze Logcat-Ausgabe, die mit dem Befehl logcat -v brief output erhalten wird. Es zeigt, dass sich die Nachricht auf die Prioritätsstufe „I“ und das Tag „ActivityManager“ bezieht:

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

    Um die Protokollausgabe auf ein überschaubares Niveau zu reduzieren, können Sie die Protokollausgabe mithilfe von Filterausdrücken einschränken. Mit Filterausdrücken können Sie dem System die Tags-Prioritätskombinationen angeben, an denen Sie interessiert sind — das System unterdrückt andere Nachrichten für die angegebenen Tags.

    Ein Filterausdruck folgt diesem Format tag:priority ..., wobei tag das Tag von Interesse und priority die Mindestprioritätsstufe angibt, die für dieses Tag gemeldet werden soll. Nachrichten für dieses Tag mit oder über der angegebenen Priorität werden in das Protokoll geschrieben. Sie können eine beliebige Anzahl von tag:priority-Spezifikationen in einem einzigen Filterausdruck angeben. Die Reihe der Spezifikationen ist durch Leerzeichen getrennt.

    Hier ist ein Beispiel für einen Filterausdruck, der alle Protokollnachrichten außer denen mit dem Tag „ActivityManager“ mit der Priorität „Info“ oder höher und alle Protokollnachrichten mit dem Tag „MyApp“ mit der Priorität „Debug“ oder höher unterdrückt:

    adb logcat ActivityManager:I MyApp:D *:S

    Das letzte Element im obigen Ausdruck, *:S, setzt die Prioritätsstufe für alle Tags auf „silent“, wodurch sichergestellt wird, dass nur Protokollnachrichten mit „ActivityManager“ und „MyApp“ angezeigt werden. Die Verwendung von *:S ist eine hervorragende Möglichkeit, um sicherzustellen, dass die Protokollausgabe auf die explizit angegebenen Filter beschränkt ist.

    Der folgende Filterausdruck zeigt alle Protokollmeldungen mit der Prioritätsstufe „warning“ und höher für alle Tags an:

    adb logcat *:W

    Wenn Sie logcat von Ihrem Entwicklungscomputer aus ausführen (im Gegensatz zur Ausführung auf einer Remote-Adb-Shell), können Sie auch einen Standardfilterausdruck festlegen, indem Sie einen Wert für die Umgebungsvariable exportieren ANDROID_LOG_TAGS:

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

    Beachten Sie, dass ANDROID_LOG_TAGS Der Filter wird nicht in die Emulator- /Geräteinstanz exportiert, wenn Sie logcat von einer Remote-Shell aus ausführen oder adb shell logcat .

    Steuerprotokollausgabeformat

    Protokollnachrichten enthalten neben dem Tag und der Priorität eine Reihe von Metadatenfeldern. Sie können das Ausgabeformat für Nachrichten so ändern, dass ein bestimmtes Metadatenfeld angezeigt wird. Verwenden Sie dazu die Option -v und geben Sie eines der unten aufgeführten unterstützten Ausgabeformate an.

    • brief: Zeigt Priorität, Tag und PID des Prozesses an, der die Nachricht ausgibt.
    • long: Zeigt alle Metadatenfelder und separate Nachrichten mit Leerzeilen an.
    • process: Nur PID anzeigen.
    • raw: Zeigt die rohe Protokollnachricht ohne andere Metadatenfelder an.
    • tag: Zeigt nur die Priorität und das Tag an.
    • thread: Ein Legacy-Format, das Priorität, PID und TID des Threads anzeigt, der die Nachricht ausgibt.
    • threadtime (Standard): Zeigt Datum, Aufrufzeit, Priorität, Tag, PID und TID des Threads an, der die Nachricht ausgibt.
    • time: Zeigt Datum, Aufrufzeit, Priorität, Tag und PID des Prozesses an, der die Nachricht ausgibt.

    Wenn Sie logcat starten, können Sie das gewünschte Ausgabeformat angeben, indem Sie die -v Option verwenden:

     logcat 

    Hier ist ein Beispiel, das zeigt, wie Nachrichten in thread

    adb logcat -v thread

    Beachten Sie, dass Sie mit der Option -vnur ein Ausgabeformat angeben können, aber Sie können so viele Modifikatoren angeben, wie sinnvoll sind. Logcat ignoriert Modifikatoren, die keinen Sinn ergeben.

    Formatmodifikatoren

    Formatmodifikatoren ändern die Logcat-Ausgabe in Form einer beliebigen Kombination eines oder mehrerer der folgenden Modifikatoren. Um einen Formatmodifikator anzugeben, verwenden Sie die Option -v wie folgt:

    adb logcat -b all -v color -d

    Jeder Android-Protokollnachricht ist ein Tag und eine Priorität zugeordnet. Sie können jeden Formatmodifikator mit einer der folgenden Formatoptionen kombinieren: brieflongprocessrawtagthreadthreadtime, and time.

    You can get the format modifier details by typing logcat -v --help at the command line.

    • color: Show each priority level with a different color.
    • descriptive: Show log buffer event descriptions. Dieser Modifikator wirkt sich nur auf Ereignisprotokollpuffernachrichten aus und hat keine Auswirkungen auf die anderen nicht binären Puffer. Die Ereignisbeschreibungen stammen aus der Datenbank event-log-tags.
    • epoch: Anzeigezeit in Sekunden ab dem 1. Januar 1970.
    • monotonic: Anzeigezeit in CPU-Sekunden ab dem letzten Start.
    • printable: Stellen Sie sicher, dass alle binären Protokollierungsinhalte maskiert sind.
    • uid: Wenn die Zugriffssteuerung dies zulässt, zeigen Sie die UID oder Android-ID des protokollierten Prozesses an.
    • usec: Zeigt die Zeit mit einer Genauigkeit von bis zu Mikrosekunden an.
    • UTC: Zeit als UTC anzeigen.
    • year: Fügt der angezeigten Zeit das Jahr hinzu.
    • zone: Fügt die lokale Zeitzone zur angezeigten Zeit hinzu.

    Anzeigen alternativer Protokollpuffer

    Das Android-Protokollierungssystem speichert mehrere kreisförmige Puffer für Protokollnachrichten, und nicht alle Protokollnachrichten werden an den standardmäßigen kreisförmigen Puffer gesendet. Um zusätzliche Protokollmeldungen anzuzeigen, können Sie den Befehl logcat mit der Option -b ausführen, um die Anzeige eines alternativen kreisförmigen Puffers anzufordern. Sie können jeden dieser alternativen Puffer anzeigen:

    • radio: Zeigt den Puffer an, der funk- / Telefonie-bezogene Nachrichten enthält.
    • events: Zeigt die interpretierten Ereignispuffermeldungen des Binärsystems an.
    • main: Anzeigen des Hauptprotokollpuffers (Standard) enthält keine System- und Absturzprotokollmeldungen.
    • system: Zeigen Sie den Systemprotokollpuffer an (Standard).
    • crash: Zeigt den Absturzprotokollpuffer an (Standard).
    • all: Alle Puffer anzeigen.
    • default: Meldet mainsystem und crash Puffer.

    Die Verwendung der -b Option ist:

     logcat 

    Hier ist ein Beispiel, wie Sie einen Protokollpuffer anzeigen, der Funk- und Telefoniemeldungen enthält:

    adb logcat -b radio

    Sie können auch mehrere -b Flags für alle Puffer angeben, die Sie drucken möchten, wie folgt:

    logcat -b main -b radio -b events

    Sie können ein einzelnes -b Flag mit einer durch Kommas getrennten Liste von Puffern angeben, beispiel:

    logcat -b main,radio,events

    Protokollierung aus Code

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

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

    For example, using the following call:

    Kotlin

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

    Java

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

    The logcat outputs something like:

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

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht.