Logcat is een command-line tool die een log van systeemberichten dumpt, inclusief stack traces wanneer het apparaat een fout gooit en berichten die u hebt geschreven vanuit uw app met deLog
klasse.
deze pagina gaat over de opdrachtregel logcat tool, maar u kunt ook logmessages bekijken vanuit het logcat venster in Android Studio. Zie Logboeken schrijven en bekijken metlogcat voor informatie over het bekijken en filteren van logs van Android Studio.
Logging system overview
het Android logging system is een set van gestructureerde circulaire buffers onderhouden door het systeemproces logd
. De set beschikbare buffers wordt door het systeem vastgezet en gedefinieerd. De meest relevante zijn: main
, die de meeste applicatielogs opslaat, system
, die berichten opslaat die afkomstig zijn van het Android-besturingssysteem, en crash
, die crashlogs opslaat. Elke logboekvermelding heeft een prioriteit (één van VERBOSE
DEBUG
INFO
WARNING
ERROR
of FATAL
), een tag die de oorsprong van het logboek identificeert, en het werkelijke Logbericht.
de primaire interface naar het logsysteem is de gedeelde bibliotheek liblog
en de header <android/log.h>
. Alle taalspecifieke logfaciliteiten noemen uiteindelijk de functie __android_log_write
. Standaard roept het de functie __android_log_logd_logger
aan, die de log invoer naar logd
stuurt met behulp van een socket. Beginnend met API level 30, kan de logfunctie worden gewijzigd door __android_set_log_writer
aan te roepen. Meer informatie is beschikbaar in de NDK documentatie.
Logs weergegeven door adb logcat
ondergaan vier filterniveaus:
- Compileertijdfiltering: afhankelijk van compilatie-instellingen kunnen sommige logs volledig uit het binaire bestand worden verwijderd. Proguard kan bijvoorbeeld worden geconfigureerd om oproepen naar
Log.d
uit Java-code te verwijderen. - systeemeigenheidsfiltering:
liblog
vraagt een set Systeemeigenschappen aan om het minimale ernstniveau te bepalen dat naarlogd
moet worden verzonden. Als je log hebt de tagMyApp
, met de volgende eigenschappen worden gecontroleerd, en worden verwacht om de eerste letter van de minimale ernst (V
D
I
W
E
ofS
uitschakelen alle logs):
log.tag.MyApp
persist.log.tag.MyApp
log.tag
persist.log.tag
liblog
de minimumprioriteit die is ingesteld door __android_log_set_minimum_priority
. De standaardinstelling is INFO
.adb logcat
ondersteunt extra filters die het aantal getoonde logs kunnen verminderen vanaf logd
. Zie hieronder voor meer informatie.Opdrachtregelsyntaxis
om logcat door de adb-shell te draaien, wordt het algemene gebruik:
logcat ... ...
u kunt logcat
uitvoeren als een ADB-commando of direct in een shell-prompt van uw emulator of verbonden apparaat. Om de loguitvoer met adb te bekijken, navigeert u naar uw SDK platform-tools/
map en voert u uit:
adb logcat
Voor logcat
online help, start een apparaat en voer vervolgens uit:
adb logcat --help
u kunt een shell-verbinding maken met een apparaat en uitvoeren:
$ adb shell# logcat
opties
de volgende tabel beschrijft de commandoregelopties van logcat
.
Option | Description |
---|---|
-b <buffer>
|
Laad een alternatieve logbuffer voor weergave, zoals events orradio . De buffersetmain system , encrash wordt standaard gebruikt. Zie Alternatieve Logbuffers Bekijken. |
-c, --clear |
Wis de geselecteerde buffers en sluit af. De standaard bufferset is main system en crash . Gebruik -b all -c om alle buffers te wissen. |
-e <expr>, --regex=<expr> |
alleen regels afdrukken waarbij het Logbericht overeenkomt met <expr> waarbij <expr> een reguliere expressie is. |
-m <count>, --max-count=<count> |
Afsluiten na het afdrukken <count> aantal regels. Dit is bedoeld om te worden gekoppeld met --regex , maar zal alleen werken. |
--print |
gekoppeld met --regex en --max-count om inhoud het regex-filter te laten omzeilen, maar toch te laten stoppen bij het juiste aantal overeenkomsten. |
-d |
Dump de log naar het scherm en sluit af. |
-f <filename> |
schrijf de logboekuitvoer naar <filename> . De standaardwaarde is stdout . |
-g, --buffer-size |
Toon de grootte van de opgegeven logbuffer en sluitingen. |
-n <count> |
Stel het maximum aantal geroteerde logs in op <count> . De standaardwaarde is 4. Vereist de optie -r . |
-r <kbytes> |
draai het logbestand elke <kbytes> van de uitvoer. De standaardwaarde is 16. Vereist de optie -f . |
-s |
gelijk aan de filterexpressie '*:S' , die prioriteit voor alle tags op stil stelt, en wordt gebruikt om vooraf te gaan aan een lijst met filterexpressies die inhoud toevoegen. Ga voor meer informatie naar de sectie over het filteren van loguitvoer. |
-v <format> |
Stel het uitvoerformaat voor logberichten in. De standaardwaarde is threadtime formaat. Voor een lijst van ondersteunde formaten, ga naar de sectie over de controle log output formaat. |
-D, --dividers |
afdrukdividers tussen elke logbuffer. |
-c |
spoelen (wissen) de gehele log en afsluiten. |
-t <count> |
alleen het meest recente aantal regels weergeven. Deze optie bevat -d functionaliteit. |
-t '<time>' |
druk de meest recente regels af sinds de opgegeven tijd. Deze optie bevat -d functionaliteit. Zie de optie-P voor informatie over het citeren van parameters met ingebedde spaties.
adb logcat -t '01-26 20:52:41.820' |
-T <count>
|
druk het meest recente aantal regels af sinds de opgegeven tijd. Deze optie omvat niet -d functionaliteit |
-T '<time>'
|
Print de meest recente regels sinds de opgegeven tijd. Deze optie bevat geen include -d functionaliteit. Zie de optie-P voor informatie over het citeren van parameters met ingebedde spaties.
adb logcat -t '01-26 20:52:41.820' |
-L, -last
|
Dump de logs voor de laatste herstart. |
-B, --binary |
uitvoer de binaire login. |
-S, --statistics |
voeg statistieken toe aan de uitvoer om u te helpen log spammers te identificeren en te targeten. |
-G <size> |
Stel de grootte van de logringbuffer in. Kan K of M aan het einde toevoegen om kilobytes of megabytes aan te geven. |
-p, --prune |
Print (lezen) de huidige toestaan (white ) en weigeren (black ) lijsten en geen argumenten, als volgt:
adb logcat -p |
-P '<list> ...' |
Schrijven (stellen) de laat (white ) en weigeren (black ) lijsten aanpassen van de logging content voor een specifiek doel. U geeft een gemengde inhoud van toegestane (<white> ) en geweigerde (~<black> ) lijstvermeldingen, waarbij <white> of <black> een UID, UID/PID of /PID kan zijn. Met hulp van de logcat statistieken (logcat -S ), kan men aanpassingen overwegen aan de allow (white ) en deny (black ) lijsten voor doeleinden zoals:
standaard voorkomt het logboekregistratiesysteem automatisch dat de ergste overtreder in de logstatistieken dynamisch ruimte maakt voor nieuwe logberichten. Zodra het de heuristiek heeft uitgeput, snoeit het systeem de oudste ingangen om ruimte te maken voor de nieuwe berichten. het toevoegen van een allowlist ( Koersen $ adb logcat -P '"<white_and_blacklist>"'oradb shell$ logcat -P '<white_and_blacklist>' in Het volgende voorbeeld geeft een toestemming ( adb logcat -P '"/32676 675 ~/32677 897"' andere toestaan ( ~! worst uid blacklist~1000/! worst pid in system (1000) |
--pid=<pid> ...
|
alleen logs van de gegeven PID afdrukken. |
--wrap |
slaap gedurende 2 uur of wanneer de buffer op het punt staat om te worden afgebroken, wat het eerst komt. Verbetert de efficiëntie van peilingen door het verstrekken van een ongeveer-om-wrap wakeup. |
Filtering log output
- de tag van een logbericht is een korte tekenreeks die aangeeft van welk systeemonderdeel het bericht afkomstig is (bijvoorbeeld” View ” voor het view-systeem).
- De prioriteit is één van de volgende tekens waarden, gerangschikt van laagste naar hoogste prioriteit:
-
-
V
: Uitgebreid (laagste prioriteit) -
D
: Debug -
I
Info -
W
: Waarschuwing -
E
: Error -
F
: Fatal -
S
: Silent (hoogste prioriteit, waarop nooit wordt afgedrukt)
-
u kunt een lijst met tags verkrijgen gebruikt in het systeem, met prioriteiten, door logcat uit te voeren en de eerste twee kolommen van elk bericht te observeren, gegeven als<priority>/<tag>
.
het volgende is een voorbeeld van een korte logcat-uitvoer die is verkregen met het logcat -v brief output
Commando. Het toont aan dat het bericht betrekking heeft op prioriteitsniveau ” I “en tag “ActivityManager”:
I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}
om de loguitvoer tot een beheersbaar niveau te reduceren, kunt u de loguitvoer beperken met behulp van filteruitdrukkingen. Filteruitdrukkingen laten u aan het systeem de tags-prioriteitscombinaties aangeven waarin u geïnteresseerd bent — het systeem onderdrukt andere berichten voor de opgegeven tags.
een filteruitdrukking volgt dit formaat tag:priority ...
, waarbij tag
de tag van belang aangeeft en priority
het minimumprioriteitsniveau voor die tag aangeeft. Berichten voor die tag op of boven de opgegeven prioriteit worden naar het logboek geschreven. U kunt een willekeurig aantal tag:priority
SPECIFICATIES opgeven in een enkele filterexpressie. De reeks specificaties is witruimte-gescheiden.
Hier is een voorbeeld van een filterexpressie die alle logberichten onderdrukt behalve die met de tag “ActivityManager”, bij prioriteit “Info” of hoger, en alle logberichten met tag “MyApp”, met prioriteit “Debug” of hoger:
adb logcat ActivityManager:I MyApp:D *:S
het laatste element in de bovenstaande uitdrukking, *:S
, stelt het prioriteitsniveau voor alle tags in op” stil”, waardoor alleen logberichten met” ActivityManager “en” MyApp ” worden weergegeven. Het gebruik van *:S
is een uitstekende manier om ervoor te zorgen dat de log — uitvoer beperkt is tot de filters die u expliciet hebt opgegeven-het laat Uw filters dienen als een allowlist voor log-uitvoer.
de volgende filteruitdrukking toont alle logberichten met prioriteit “warning” en hoger, op alle tags:
adb logcat *:W
Als u logcat van uw computer (ten opzichte van het op afstand adb shell), kunt u ook een standaard filter uitdrukking door het exporteren van een waarde voor de omgevingsvariabele ANDROID_LOG_TAGS
:
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
Merk op dat ANDROID_LOG_TAGS
filter wordt niet geëxporteerd naar de emulator/apparaat bijvoorbeeld, als u werkt met logcat van een remote shell of het gebruik van adb shell logcat
.
controle log output formaat
Log berichten bevatten een aantal metagegevens velden, naast de tag en prioriteit. U kunt het uitvoerformaat voor berichten wijzigen zodat ze een specifiek metadata-veld weergeven. Hiervoor gebruikt u de optie -v
en specificeert u een van de ondersteunde uitvoerformaten hieronder.
-
brief
: geef prioriteit, tag en PID weer van het proces dat het bericht afgeeft. -
long
: Toon alle metagegevensvelden en aparte berichten met lege regels. -
process
: Alleen PID weergeven. -
raw
: Toon het raw-Logbericht zonder andere metagegevensvelden. -
tag
: alleen de prioriteit en de tag weergeven. -
thread:
een oud formaat dat prioriteit, PID en TID toont van de thread die het bericht afgeeft. -
threadtime
(standaard): Toon de datum, aanroeptijd, prioriteit, tag, PID en TID van de thread die het bericht afgeeft. -
time
: Toon de datum, aanroeptijd, prioriteit, tag en PID van het proces dat het bericht afgeeft.
bij het starten van logcat kunt u het gewenste uitvoerformaat opgeven met behulp van de -v
optie:
logcat
Hier is een voorbeeld dat laat zien hoe u berichten kunt genereren in thread
uitvoerformaat:
adb logcat -v thread
merk op dat u slechts één uitvoerformaat kunt opgeven met de optie -v
, maar u kunt zoveel modifiers opgeven die zinvol zijn. Logcat negeert modifiers die geen zin hebben.
Format modifiers
Format modifiers wijzig de logcat-uitvoer in termen van een combinatie van een of meer van de volgende modifiers. Om een format modifier op te geven, gebruikt u de optie -v
als volgt:
adb logcat -b all -v color -d
elk Android Logbericht heeft een tag en een prioriteit die eraan is gekoppeld. U kunt elke format modifier combineren met een van de volgende format opties: 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. Deze modifier beà nvloedt alleen gebeurtenislogbufferberichten en heeft geen effect op de andere niet-binaire buffers. De gebeurtenisbeschrijvingen komen uit de event-log-tags database. -
epoch
: weergavetijd in seconden vanaf 1 januari 1970. -
monotonic
: tijd weergeven in CPU seconden vanaf de laatste opstart. -
printable
: zorg ervoor dat binaire logging-inhoud is ontsnapt. -
uid
: indien toegestaan door toegangscontroles, Toon de UID of Android ID van het gelogde proces. -
usec
: Toon de tijd met precisie tot microseconden. -
UTC
: tijd weergeven als UTC. -
year
: voeg het jaar toe aan de weergegeven tijd. -
zone
: voeg de lokale tijdzone toe aan de weergegeven tijd.
alternatieve logbuffers weergeven
het Android-logboekregistratiesysteem houdt meerdere cirkelbuffers voor logberichten bij, en niet alle logberichten worden naar de standaard cirkelbuffer verzonden. Om extra logberichten te zien, kunt u de opdracht logcat
uitvoeren met de optie -b
om het bekijken van een alternatieve cirkelbuffer aan te vragen. U kunt elk van deze alternatieve buffers bekijken:
-
radio
: bekijk de buffer die radio/Telefonie-gerelateerde berichten bevat. -
events
: bekijk de geïnterpreteerde bufferberichten voor binaire systeemgebeurtenissen. -
main
: bekijk de hoofdlogbuffer (standaard) bevat geen systeem-en crashlogberichten. -
system
: Bekijk de systeemlogbuffer (standaard). -
crash
: bekijk de crash log buffer (standaard). -
all
: alle buffers weergeven. -
default
: Reportsmain
system
, encrash
buffers.
het gebruik van de optie -b
is:
logcat
Hier is een voorbeeld van het bekijken van een logbuffer met radio-en telefoonberichten:
adb logcat -b radio
U kunt ook meerdere -b
vlaggen voor alle buffers die u wilt afdrukken, als volgt:
logcat -b main -b radio -b events
U kunt opgeven één -b
vlag met een komma-gescheiden lijst van buffers, bijvoorbeeld:
logcat -b main,radio,events
Log van de code
De Log
class kunt u vermeldingen in de code dat wordt weergegeven in de logcat tool. De gemeenschappelijke methodes van het loggen omvatten:
-
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