Maybaygiare.org

Blog Network

Logcat command-line tool

Logcat este un instrument de linie de comandă care aruncă un jurnal de mesaje de sistem, inclusiv urme de stivă atunci când dispozitivul aruncă o eroare și mesajele pe care le-ați scris din aplicația dvs. cuLog clasă.

această pagină este despre instrumentul logcat din linia de comandă, dar puteți vizualiza și logmessages din fereastra Logcat din Android Studio. Pentru informații despre vizualizarea și filtrarea jurnalelor din Android Studio, consultați scrierea și Vizualizarea jurnalelor cu logcat.

Prezentare generală a sistemului de logare

sistemul de logare Android este un set de tampoane circulare structurate întreținute de procesul de sistemlogd. Setul de tampoane disponibile este fixat și definit de sistem. Cele mai relevante sunt: main, care stochează majoritatea jurnalelor de aplicații, system, care stochează mesaje provenite din Sistemul de operare Android și crash, care stochează jurnalele de avarie. Fiecare intrare jurnal are o prioritate (una dintre VERBOSEDEBUGINFOWARNINGERROR sau FATAL), o etichetă care identifică originea jurnalului și mesajul jurnal real.

interfața principală a sistemului de logare este biblioteca partajată liblog și antetul său <android/log.h>. Toate facilitățile de logare specifice limbii apelează în cele din urmă funcția __android_log_write. În mod implicit, apelează funcția __android_log_logd_logger, care trimite intrarea în jurnal la logd folosind o priză. Începând cu nivelul API 30, funcția de înregistrare poate fi modificată apelând __android_set_log_writer. Mai multe informații sunt disponibile în documentația NDK.

jurnalele afișate deadb logcat suferă patru niveluri de filtrare:

  1. filtrare în timp de compilare: în funcție de setările de compilare, unele jurnale pot fi complet eliminate din binar. De exemplu, Proguard poate fi configurat pentru a elimina apelurile către Log.d din codul Java.
  2. sistem de filtrare proprietate:liblog interogări un set de proprietăți de sistem pentru a determina nivelul minim de severitate care urmează să fie trimise lalogd. Dacă jurnalele dvs. au eticheta MyApp, sunt bifate următoarele proprietăți și se așteaptă să conțină prima literă a severității minime (VDIWE, sau S pentru a dezactiva toate jurnalele):
  • log.tag.MyApp
  • persist.log.tag.MyApp
  • log.tag
  • persist.log.tag
  • filtrarea aplicațiilor: Dacă niciuna dintre proprietăți nu este setată, liblog folosește prioritatea minimă setată de __android_log_set_minimum_priority. Setarea implicită este INFO.
  • filtrarea afișajului:adb logcat acceptă filtre suplimentare care pot reduce cantitatea de jurnale afișate dinlogd. A se vedea mai jos pentru detalii.
  • sintaxa liniei de comandă

    pentru a rula logcat prin shell-ul adb, utilizarea generală este:

     logcat ... ...

    puteți rulalogcat ca comandă adb sau direct într-un prompt shell al emulatorului sau al dispozitivului conectat. Pentru a vizualiza ieșire jurnal folosind adb, navigați la SDK-ul platform-tools/ director și executa:

    adb logcat

    pentru logcat ajutor online, porniți un dispozitiv și apoi executa:

    adb logcat --help

    puteți crea o conexiune shell la un dispozitiv și executa:

    $ adb shell# logcat

    Opțiuni

    următorul tabel descrie opțiunile liniei de comandă alelogcat.

    opțiune descriere
    -b <buffer> încărcați un tampon de jurnal alternativ pentru vizualizare, cum ar fi eventssau radio. Setul tampon mainsystemșicrash este utilizat în mod implicit. Consultați Vizualizarea Tampoanelor De Jurnal Alternative.
    -c, --clear ștergeți (spălați) tampoanele selectate și ieșiți. Setul tampon implicit este mainsystemșicrash. Pentru a șterge toate tampoanele, utilizați -b all -c.
    -e <expr>, --regex=<expr> numai linii de imprimare în cazul în care mesajul jurnal se potrivește<expr> unde<expr> este o expresie regulată.
    -m <count>, --max-count=<count> ieșiți după imprimare<count> numărul de linii. Acest lucru este menit să fie asociat cu --regex, dar va funcționa pe cont propriu.
    --print asociat cu--regex și--max-count pentru a lăsa conținutul să ocolească filtrul regex, dar totuși să se oprească la numărul corect de potriviri.
    -d aruncați jurnalul pe ecran și ieșiți.
    -f <filename> scrieți ieșirea mesajului jurnal la<filename>. Valoarea implicită este stdout.
    -g, --buffer-size imprimați dimensiunea bufferului de jurnal specificat și ieșirile.
    -n <count> Setați numărul maxim de jurnale rotite la<count>. Valoarea implicită este 4. Necesită opțiunea -r.
    -r <kbytes> rotiți fișierul jurnal la fiecare<kbytes> de ieșire. Valoarea implicită este 16. Necesită opțiunea -f.
    -s echivalent cu expresia filtrului'*:S', care stabilește prioritatea pentru toate etichetele la silențios și este utilizată pentru a precede o listă de expresii de filtrare care adaugă conținut. Pentru a afla mai multe, accesați secțiunea despre filtrarea ieșirii jurnalului.
    -v <format> Setați formatul de ieșire pentru mesajele jurnal. Valoarea implicită este threadtime format. Pentru o listă de formate acceptate, accesați secțiunea Despre formatul de ieșire jurnal de Control.
    -D, --dividers divizoare de imprimare între fiecare tampon jurnal.
    -c spălați (ștergeți) întregul jurnal și ieșiți.
    -t <count> imprimați numai cel mai recent număr de linii. Această opțiune include-d funcționalitate.
    -t '<time>' imprimați cele mai recente linii de la ora specificată. Această opțiune include-d funcționalitate. Consultați opțiunea-P pentru informații despre citarea parametrilor cu spații încorporate.

    adb logcat -t '01-26 20:52:41.820'
    -T <count> imprimați cel mai recent număr de linii de la ora specificată. Această opțiune nu include-d funcționalitate
    -T '<time>' imprimați cele mai recente linii de la ora specificată. Această opțiune nu include include -d funcționalitate. Consultați opțiunea-P pentru informații despre citarea parametrilor cu spații încorporate.

    adb logcat -t '01-26 20:52:41.820'
    -L, -last aruncați jurnalele înainte de ultima repornire.
    -B, --binary ieșire jurnal în binar.
    -S, --statistics includeți statistici în ieșire pentru a vă ajuta să identificați și să vizați spammerii de jurnal.
    -G <size> Setați dimensiunea tamponului inelului jurnal. Poate adăuga K sau M la sfârșit pentru a indica kilobytes sau megabytes.
    -p, --prune Tipărește (citește) curentul permite (white) și neagă (black) listează și nu ia argumente, după cum urmează:

    adb logcat -p
    -P '<list> ...'
    --prune '<list> ...' -P '<white_and_black_list>'
    scrie (Set) permite (white) și deny (black) liste pentru a ajusta înregistrarea conținutului pentru un anumit scop. Furnizați un conținut mixt de intrări de listă permise (<white>) și refuzate (~<black>), unde <white> sau <black> poate fi un UID, UID/PID sau /PID. Cu îndrumări din Statisticile logcat (logcat -S), se pot lua în considerare ajustări ale listelor allow (white) și deny (black) în scopuri precum:

    • oferă cea mai mare longevitate conținutului specific de logare prin selecții UID.
    • împiedicați pe cineva (UID) sau ceva (PID) să consume aceste resurse pentru a ajuta la creșterea logspan-ului, astfel încât să puteți avea mai multă vizibilitate asupra problemelor pe care le diagnosticați.

    în mod implicit sistemul de logare previne automat cel mai rău infractor în Statisticile jurnal dinamic pentru a face spațiu pentru noi mesaje jurnal. Odată ce a epuizat euristica, sistemul prune cele mai vechi intrări pentru a face spațiu pentru noile mesaje.

    adăugarea unui allowlist (whitelist) vă protejează Numărul de identificare Android (AID), care devine ajutorul proceselor și GID de a fi declarat infractor și adăugarea unui denylist ajută la eliberarea spațiului înainte ca cei mai răi infractori să fie luați în considerare. Puteți alege cât de activă este tăierea și puteți dezactiva tăierea, astfel încât să elimine doar conținutul din cele mai vechi intrări din fiecare tampon de jurnal.

    Citate

    adb logcat nu păstrează ghilimelele, deci sintaxa pentru specificarea listelor allow (white) și deny (black) este următoarea:

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

    următorul exemplu specifică o listă allow (white) cu PID 32676 și UID 675 și o listă deny (black) cu PID 32677 și UID 897. PID 32677 pe denylist este ponderat pentru tăierea mai rapidă.

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

    altele permit (white) și refuză (black) lista variațiilor de comandă pe care le puteți utiliza sunt următoarele:

    ~! worst uid blacklist~1000/! worst pid in system (1000)
    --pid=<pid> ... imprimați numai jurnalele de la PID-ul dat.
    --wrap dormiți 2 ore sau când tamponul este pe cale să se înfășoare, oricare dintre acestea survine mai întâi. Îmbunătățește eficiența de votare prin furnizarea de o despre-La-wrap wakeup.

    ieșire jurnal de filtrare

    • eticheta unui mesaj jurnal este un șir scurt care indică componenta de sistem din care provine mesajul (de exemplu, „vizualizare” pentru sistemul de vizualizare).
    • prioritatea este una dintre următoarele valori de caractere, ordonate de la cea mai mică la cea mai mare prioritate:
      • V: Verbose (cea mai mică prioritate)
      • D: depanare
      • I: info
      • W: Avertisment
      • E: eroare
      • F: Fatal
      • S: Silent (cea mai mare prioritate, pe care nimic nu este imprimat vreodată)

    tu poate obține o listă de etichete utilizate în sistem, cu priorități, rulând logcat și observând primele două coloane ale fiecărui mesaj, date ca <priority>/<tag>.

    Următorul este un exemplu de ieșire logcat scurtă obținută cu comandalogcat -v brief output. Acesta arată că mesajul se referă la nivelul de prioritate ” I ” și tag-ul „ActivityManager”:

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

    pentru a reduce ieșirea jurnalului la un nivel gestionabil, puteți restricționa ieșirea jurnalului folosind expresii de filtrare. Expresiile de filtrare vă permit să indicați sistemului etichetele – combinații prioritare care vă interesează — sistemul suprimă alte mesaje pentru etichetele specificate.

    o expresie de filtru urmează acest formattag:priority ..., undetag indică eticheta de interes șipriority indică nivelul minim de prioritate de raportat pentru acea etichetă. Mesajele pentru acea etichetă la sau deasupra priorității specificate sunt scrise în jurnal. Puteți furniza orice număr de tag:priority specificații într-o singură expresie filtru. Seria de specificații este delimitată de spații albe.

    Iată un exemplu de Expresie filtru care suprimă toate mesajele jurnal, cu excepția celor cu tag-ul „ActivityManager”, la prioritate „Info” sau mai sus, și toate mesajele jurnal cu tag-ul „MyApp”, cu prioritate „Debug” sau mai sus:

    adb logcat ActivityManager:I MyApp:D *:S

    elementul final din expresia de mai sus,*:S, setează nivelul de prioritate pentru toate etichetele la „silent”, asigurându-se astfel că sunt afișate doar mesajele de jurnal cu „ActivityManager” și „MyApp”. Utilizarea *:S este o modalitate excelentă de a vă asigura că ieșirea jurnalului este limitată la filtrele pe care le — ați specificat în mod explicit-permite filtrelor dvs. să servească drept listă de permise pentru ieșirea jurnalului.

    următoarea expresie filtru afișează toate mesajele jurnal cu nivel de prioritate „avertisment” și mai mare, pe toate etichetele:

    adb logcat *:W

    dacă rulați logcat de pe computerul dvs. de dezvoltare (față de rularea acestuia pe un shell adb la distanță), puteți seta, de asemenea, o expresie de filtru implicită exportând o valoare pentru variabila de mediu ANDROID_LOG_TAGS:

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

    rețineți că ANDROID_LOG_TAGS filtrul nu este exportat în instanța emulatorului/dispozitivului, dacă rulați logcat dintr-un shell la distanță sau utilizați adb shell logcat.

    format de ieșire jurnal de Control

    mesajele jurnal conțin un număr de câmpuri de metadate, în plus față de etichetă și prioritate. Puteți modifica formatul de ieșire pentru mesaje, astfel încât acestea să afișeze un anumit câmp de metadate. Pentru a face acest lucru, utilizați opțiunea -v și specificați unul dintre formatele de ieșire acceptate enumerate mai jos.

    • brief: afișați prioritatea, eticheta și PID-ul procesului care emite mesajul.
    • long: Afișează toate câmpurile de metadate și mesajele separate cu linii goale.
    • process: Afișează numai PID.
    • raw: afișează mesajul jurnal brut fără alte câmpuri de metadate.
    • tag: afișați numai prioritatea și eticheta.
    • thread: un format vechi care afișează prioritatea, PID-ul și TID-ul firului care emite mesajul.
    • threadtime (implicit): afișează data, ora invocării, prioritatea, eticheta, PID-ul și TID-ul firului care emite mesajul.
    • time: afișează data, ora invocării, prioritatea, eticheta și PID-ul procesului care emite mesajul.

    când porniți logcat, puteți specifica formatul de ieșire dorit utilizând opțiunea-v:

     logcat 

    Iată un exemplu care arată cum se generează mesaje înthread format de ieșire:

    adb logcat -v thread

    rețineți că puteți specifica un singur format de ieșire cu opțiunea-v, dar puteți specifica cât mai mulți modificatori care au sens. Logcat ignoră modificatorii care nu au sens.modificatorii de Format

    modificatorii de Format

    modifică ieșirea logcat în ceea ce privește orice combinație a unuia sau mai multor dintre următorii modificatori. Pentru a specifica un modificator de format, utilizați opțiunea -v, după cum urmează:

    adb logcat -b all -v color -d

    fiecare mesaj de jurnal Android are o etichetă și o prioritate asociată cu acesta. Puteți combina orice modificator de format cu oricare dintre următoarele opțiuni de format: 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. Acest modificator afectează numai mesajele tampon jurnal de evenimente și nu are niciun efect asupra celorlalte tampoane non-binare. Descrierile evenimentelor provin din Baza de date event-log-tags.
    • epoch: timp de afișare în secunde începând de la 1 ianuarie 1970.
    • monotonic: timpul de afișare în secunde CPU începând de la ultima pornire.
    • printable: asigurați-vă că orice conținut binar de logare este scăpat.
    • uid: dacă este permis de controalele de acces, afișați ID-ul UID sau Android al procesului înregistrat.
    • usec: Afișează timpul cu precizie până la microsecunde.
    • UTC: Afișează timpul ca UTC.
    • year: adăugați anul la ora afișată.
    • zone: adăugați fusul orar local la ora afișată.

    vizualizarea tampoanelor alternative de jurnal

    sistemul de Înregistrare Android păstrează mai multe tampoane circulare pentru mesajele de jurnal și nu toate mesajele de jurnal sunt trimise la tamponul circular implicit. Pentru a vedea mesaje de jurnal suplimentare, puteți rula logcat comanda cu -b opțiune, pentru a solicita vizualizarea unui tampon circular alternativ. Puteți vizualiza oricare dintre aceste tampoane alternative:

    • radio: Vizualizați tamponul care conține mesaje legate de radio / telefonie.
    • events: vizualizați mesajele tampon de evenimente ale sistemului binar interpretat.
    • main: Vizualizați tamponul principal de jurnal (implicit) nu conține mesaje de jurnal de sistem și accident.
    • system: Vizualizați tamponul jurnal de sistem (implicit).
    • crash: Vizualizați tamponul jurnalului de avarie (implicit).
    • all: Vizualizați toate tampoanele.
    • default: rapoartemainsystem șicrash tampoane.

    utilizarea-b opțiunea este:

     logcat 

    Iată un exemplu de modul de a vizualiza un tampon jurnal care conține mesaje radio și telefonie:

    adb logcat -b radio

    de asemenea, puteți specifica mai multe-b steaguri pentru toate tampoanele pe care doriți să le imprimați, după cum urmează:

    logcat -b main -b radio -b events

    puteți specifica un singur-b steag cu virgulă-listă separată de tampoane, de exemplu:

    logcat -b main,radio,events

    logare din cod

    Log clasa vă permite să creați intrări de jurnal în codul dvs. care se afișează în instrumentul logcat. Metodele comune de logare includ:

    • 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

    Lasă un răspuns

    Adresa ta de email nu va fi publicată.