Logcat ist ein Befehlszeilentool, das ein Log von Systemmeldungen ausgibt, einschließlich der Nachrichten, die Sie aus der Anwendung mit der Klasse Log
geschrieben haben.
Auf dieser Seite geht es um das logcat
-Befehlszeilentool. Sie können aber auch Logeinträge aus dem Fenster Logcat in Android Studio aufrufen. Informationen zum Ansehen und Filtern von Logs aus Android Studio finden Sie unter Logs mit Logcat ansehen und schreiben.
Logging-Systemübersicht
Das Android-Logging-System besteht aus einer Reihe strukturierter zirkulärer Zwischenspeicher, die vom Systemprozess logd
verwaltet werden. Die Gruppe der verfügbaren Puffer wird vom System festgelegt und festgelegt. 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 Logs identifiziert, und die eigentliche Lognachricht.
Die primäre C/C++-Schnittstelle zum Logging-System ist die gemeinsam genutzte Bibliothek liblog
und ihr Header <android/log.h>
.
Alle sprachspezifischen Logging-Funktionen (einschließlich android.util.Log
) rufen schließlich die Funktion __android_log_write
auf. Standardmäßig wird die Funktion __android_log_logd_logger
aufgerufen, die den Logeintrag mit einem Socket an logd
sendet. Ab API-Level 30 kann die Logging-Funktion durch Aufrufen von __android_set_log_writer
geändert werden. Weitere Informationen finden Sie in der NDK-Dokumentation.
Von adb logcat
angezeigte Logs werden vier Stufen der Filterung durchlaufen:
- Filterung nach Kompilierungszeit
- Abhängig von den Kompilierungseinstellungen werden einige Logs möglicherweise vollständig aus der Binärdatei entfernt. ProGuard kann beispielsweise so konfiguriert werden, dass Aufrufe von
Log.d
aus Java-Code entfernt werden. - Nach Systemeigenschaften filtern
liblog
fragt eine Reihe von Systemattributen ab, um den minimalen Schweregrad zu bestimmen, der anlogd
gesendet werden soll. Wenn Ihre Logs das TagMyApp
enthalten, werden die folgenden Attribute geprüft und müssen den ersten Buchstaben des Mindestschweregrads enthalten (V
,D
,I
,W
,E
oderS
, 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 von__android_log_set_minimum_priority
festgelegte minimale Priorität. Die Standardeinstellung istINFO
. - Displayfilterung
adb logcat
unterstützt zusätzliche Filter, mit denen die Anzahl der vonlogd
angezeigten Logs reduziert werden kann. Weitere Informationen finden Sie im Abschnitt zum Filtern der Logausgabe.
Befehlszeilensyntax
Die allgemeine Verwendung zum Ausführen von logcat
über die adb
-Shell lautet:
[adb] shell logcat [<option>] ... [<filter-spec>] ...
Es gibt auch eine Kurzschreibweise von adb logcat
, die aber zu adb shell logcat
erweitert wird.
Optionen
logcat
hat viele Optionen. Welche Optionen verfügbar sind, hängt von der Betriebssystemversion des verwendeten Geräts ab. Führen Sie folgenden Befehl aus, um die Hilfe zu logcat
für das verwendete Gerät aufzurufen:
adb logcat --help
Da logcat
ein Tool für Betriebssystem- und App-Entwickler ist (wobei App-Entwickler voraussichtlich stattdessen Android Studio verwenden), können viele der Optionen nur als root
verwendet werden.
Logausgabe filtern
Das Tag einer Lognachricht ist ein kurzer String, der die Systemkomponente angibt, von der die Nachricht stammt. Beispiel: „View“ für das Ansichtssystem.
Die Priorität ist einer der folgenden Zeichenwerte, sortiert von der niedrigsten zur höchsten Priorität:
V
: Ausführlich (niedrigste Priorität)D
: FehlerbehebungI
: InformationenW
: WarnungE
: FehlerF
: SchwerwiegendS
: Lautlos (höchste Priorität, bei der nie gedruckt wird)
Um eine Liste der im System verwendeten Tags mit Prioritäten zu erhalten, führen Sie logcat
aus und beobachten die ersten beiden Spalten jeder Nachricht, die als <priority>/<tag>
angegeben werden.
Das folgende Beispiel zeigt eine kurze logcat
-Ausgabe, die mit dem Befehl logcat -v brief output
abgerufen wird. Die Ausgabe 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 Logausgabe auf ein überschaubares Maß zu reduzieren, beschränken Sie die Logausgabe mithilfe von Filterausdrücken. Mit Filterausdrücken können Sie dem System die gewünschten Kombinationen der Tag-Prioritäten angeben. Das System unterdrückt andere Meldungen für die angegebenen Tags.
Ein Filterausdruck folgt dem Format tag:priority ...
, wobei tag
das relevante Tag und priority
die minimale Prioritätsstufe angibt, die für dieses Tag gemeldet werden soll. Nachrichten für dieses Tag mit der angegebenen Priorität oder höher werden in das Log geschrieben. Geben Sie eine beliebige Anzahl von tag:priority
-Spezifikationen in einem einzelnen Filterausdruck an. Die Reihe der Spezifikationen ist durch Leerzeichen getrennt.
Im Folgenden finden Sie ein Beispiel für einen Filterausdruck, mit dem alle Logmeldungen mit Ausnahme der Logmeldungen mit dem Tag "ActivityManager" mit der Priorität "Info" oder höher und der mit dem Tag "MyApp" mit der Priorität "Debug" oder höher unterdrückt werden:
adb logcat ActivityManager:I MyApp:D *:S
Mit dem letzten Element im vorherigen Ausdruck, *:S
, wird die Prioritätsstufe für alle Tags auf „Lautlos“ festgelegt. Dadurch wird sichergestellt, dass nur Logeinträge mit „ActivityManager“ und „MyApp“ angezeigt werden. Mit *:S
wird sichergestellt, dass die Logausgabe auf die von Ihnen explizit angegebenen Filter beschränkt ist. Mit *:S
können Ihre Filter als Zulassungsliste für die Logausgabe dienen.
Hinweis:In einigen Shells ist das Zeichen „*
“ für die 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 Logmeldungen mit der Prioritätsstufe „Warnung“ und höher für alle Tags angezeigt:
adb logcat *:W
Wenn Sie logcat
auf Ihrem Entwicklungscomputer statt in einer Remote-adb
-Shell ausführen, können Sie auch einen Standardfilterausdruck festlegen, indem Sie einen Wert für die Umgebungsvariablen ANDROID_LOG_TAGS
exportieren:
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
Der Filter ANDROID_LOG_TAGS
wird nicht in den Emulator bzw. die Geräteinstanz exportiert, wenn Sie logcat
über eine Remote-Shell ausführen oder adb shell
logcat
verwenden.
Ausgabeformat des Steuerprotokolls
Neben dem Tag und der Priorität enthalten Lognachrichten eine Reihe von Metadatenfeldern. Sie können das Ausgabeformat für Nachrichten so ändern, dass sie ein bestimmtes Metadatenfeld anzeigen. Verwenden Sie dazu die Option -v
und geben Sie eines der folgenden unterstützten Ausgabeformate an:
brief
: Zeigt die Priorität, das Tag und die PID des Prozesses an, von dem die Nachricht stammt.long
: Zeigt alle Metadatenfelder und separate Nachrichten mit Leerzeilen an.process
: Zeigt nur die PID an.raw
: Zeigt die unformatierte Protokollnachricht ohne weitere Metadatenfelder an.tag
: Hier werden nur die Priorität und das Tag angezeigt.thread:
: Ein Legacy-Format, das Priorität, PID und TID des Threads anzeigt, der die Nachricht ausstellt.threadtime
(Standard): Zeigt das Datum, die Aufrufzeit, die Priorität, das Tag, die PID und die TID des Threads an, der die Nachricht ausstellt.time
: Zeigt das Datum, die Aufrufzeit, die Priorität, das Tag und die PID des Prozesses an, der die Nachricht ausgibt.
Geben Sie beim Starten von logcat
mit der Option -v
das gewünschte Ausgabeformat an:
[adb] logcat [-v <format>]
Das folgende Beispiel zeigt, wie Nachrichten im thread
-Ausgabeformat generiert werden:
adb logcat -v thread
Mit der Option -v
können Sie nur ein Ausgabeformat angeben. Sie können jedoch beliebig viele Modifikatoren angeben, sofern sie sinnvoll sind. logcat
ignoriert Modifikatoren, die keinen Sinn ergeben.
Formatmodifikatoren
Formatmodifikatoren ändern die logcat
-Ausgabe. Verwenden Sie die Option -v
so, um einen Formatmodifikator anzugeben:
adb logcat -b all -v color -d
Jeder Android-Lognachricht ist ein Tag und eine Priorität zugeordnet. Sie können einen Formatmodifikator mit einer der folgenden Formatoptionen kombinieren:
brief
long
process
raw
tag
thread
threadtime
time
Geben Sie in die Befehlszeile logcat -v --help
ein, um die folgenden Modifikatordetails zu formatieren:
color
: Jede Prioritätsstufe wird in einer anderen Farbe angezeigt.descriptive
: Zeigt Beschreibungen von Protokollzwischenspeicherereignissen an. Dieser Modifikator wirkt sich nur auf Zwischenspeichernachrichten für Ereignisprotokolle aus und hat keine Auswirkungen auf die anderen nicht binären Puffer. Die Ereignisbeschreibungen stammen aus der Ereignislog-Tag-Datenbank.epoch
: Die Zeit wird in Sekunden ab dem 1. Januar 1970 angezeigt.monotonic
: Zeigt die Zeit in CPU-Sekunden ab dem letzten Start an.printable
: stellt sicher, dass Inhalte im binären Logging mit Escapezeichen versehen werden.uid
: Zeigt die UID oder Android-ID des protokollierten Prozesses an, sofern dies für die Zugriffssteuerungen zulässig ist.usec
: Zeigt die Zeit in Mikrosekunden an.UTC
: Die Zeit wird als UTC angezeigt.year
: Damit wird das Jahr zur angezeigten Zeit hinzugefügt.zone
: Fügt die lokale Zeitzone zur angezeigten Zeit hinzu.
Alternative Protokollzwischenspeicher ansehen
Das Logging-System von Android behält mehrere temporäre Zwischenspeicher für Log-Nachrichten vor und nicht alle Log-Nachrichten werden an den standardmäßigen zirkulären Zwischenspeicher gesendet. Zum Anzeigen zusätzlicher Logeinträge führen Sie den Befehl logcat
mit der Option -b
aus, um die Anzeige eines alternativen zirkulären Zwischenspeichers anzufordern. Sie können einen beliebigen dieser alternativen Puffer anzeigen:
radio
: ruft den Zwischenspeicher auf, der Radio-/Telefonienachrichten enthält.events
: zeigt die interpretierten binären Systemereignis-Zwischenspeichermeldungen an.main
: Ruft den Log-Hauptzwischenspeicher auf (Standardeinstellung), der keine System- und Absturz-Log-Nachrichten enthält.system
: Ruft den Systemprotokollzwischenspeicher auf (Standardeinstellung).crash
: Ruft den Absturzprotokollzwischenspeicher auf (Standardeinstellung).all
: Aufrufe aller Zwischenspeicher.default
: Puffer für Berichtemain
,system
undcrash
ein.
Die Option -b
wird folgendermaßen verwendet:
[adb] logcat [-b <buffer>]
Hier ist ein Beispiel, wie Sie einen Protokollpuffer mit Funk- und Telefonienachrichten aufrufen können:
adb logcat -b radio
Geben Sie Folgendes ein, um mehrere -b
-Flags für alle Zwischenspeicher anzugeben, die Sie ausgeben möchten:
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 im Code erstellen, die im logcat
-Tool angezeigt werden. Zu den gängigen Protokollierungsmethoden gehören:
Log.v(String, String)
(ausführlich)Log.d(String, String)
(zur Fehlerbehebung)Log.i(String, String)
(Informationen)Log.w(String, String)
(Warnung)Log.e(String, String)
(Fehler)
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