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 VERBOSE
DEBUG
INFO
WARNING
ERROR
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:
- 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. - Systemeigenschaftsfilterung:
liblog
fragt eine Reihe von Systemeigenschaften ab, um den minimalen Schweregrad zu bestimmen, der anlogd
gesendet werden soll. Wenn Ihre Protokolle das TagMyApp
haben, werden die folgenden Eigenschaften überprüft und enthalten voraussichtlich den ersten Buchstaben des Mindestschweregrads (V
D
I
W
E
oderS
, um alle Protokolle zu deaktivieren):
log.tag.MyApp
persist.log.tag.MyApp
log.tag
persist.log.tag
liblog
die von __android_log_set_minimum_priority
festgelegte Mindestpriorität. Die Standardeinstellung ist INFO
.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 main system 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 main system 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> ...' |
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:
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 ( Anführungszeichen $ adb logcat -P '"<white_and_blacklist>"'oradb shell$ logcat -P '<white_and_blacklist>' Das folgende Beispiel gibt eine Liste allow ( adb logcat -P '"/32676 675 ~/32677 897"' Andere erlauben ( ~! 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 -v
nur 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: brief
long
process
raw
tag
thread
threadtime
, 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
: Meldetmain
system
undcrash
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