Maybaygiare.org

Blog Network

Strumento da riga di comando Logcat

Logcat è uno strumento da riga di comando che scarica un registro di messaggi di sistema, incluse le tracce di stack quando thedevice genera un errore e messaggi che hai scritto dalla tua app con la classeLog.

Questa pagina riguarda lo strumento logcat della riga di comando, ma è anche possibile visualizzare i messaggi di log dalla finestra Logcat in Android Studio. Per informazioni sulla visualizzazione e il filtraggio dei registri da Android Studio,vedere Scrivere e visualizzare i registri withLogcat.

Panoramica del sistema di registrazione

Il sistema di registrazione Android è un insieme di buffer circolari strutturati gestiti dal processo di sistemalogd. Il set di buffer disponibili è fisso e definito dal sistema. I più rilevanti sono: main, che memorizza la maggior parte dei registri delle applicazioni, system, che memorizza i messaggi provenienti dal sistema operativo Android, e crash, che memorizza i registri di crash. Ogni voce di registro è una priorità (uno dei VERBOSEDEBUGINFOWARNINGERROR o FATAL), un tag che identifica l’origine di registro, e il reale messaggio di log.

L’interfaccia principale del sistema di registrazione è la libreria condivisalibloge la sua intestazione<android/log.h>. Tutte le strutture di registrazione specifiche della lingua alla fine chiamano la funzione __android_log_write. Per impostazione predefinita, chiama la funzione__android_log_logd_logger, che invia la voce di registro alogd utilizzando un socket. A partire dal livello API 30, la funzione di registrazione può essere modificata chiamando __android_set_log_writer. Ulteriori informazioni sono disponibili nella documentazione NDK.

I log visualizzati da adb logcat subiscono quattro livelli di filtraggio:

  1. Filtro in fase di compilazione: a seconda delle impostazioni di compilazione, alcuni log possono essere completamente rimossi dal binario. Ad esempio, Proguard può essere configurato per rimuovere le chiamate a Log.d dal codice Java.
  2. System property filtering:liblog interroga una serie di proprietà di sistema per determinare il livello minimo di gravità da inviare alogd. Se i registri sono i tag MyApp, le seguenti proprietà sono controllate, e dovranno contenere la prima lettera della gravità minima (VDIWE o S disabilitare tutti i registri):
  • log.tag.MyApp
  • persist.log.tag.MyApp
  • log.tag
  • persist.log.tag
  • Applicazione di filtraggio: Se nessuna delle proprietà è impostata,liblog utilizza la priorità minima impostata da__android_log_set_minimum_priority. L’impostazione predefinita è INFO.
  • Display filtering:adb logcat supporta filtri aggiuntivi che possono ridurre la quantità di log visualizzati dalogd. Vedi sotto per i dettagli.
  • Sintassi della riga di comando

    Per eseguire logcat attraverso la shell adb, l’utilizzo generale è:

     logcat ... ...

    È possibile eseguirelogcat come comando adb o direttamente in un prompt della shell dell’emulatore o del dispositivo collegato. Per visualizzare i log di output utilizzando adb, navigare il SDK platform-tools/ directory ed eseguire:

    adb logcat

    logcat guida in linea, avviare un dispositivo e poi eseguire:

    adb logcat --help

    È possibile creare una shell di connessione a un dispositivo ed eseguire:

    $ adb shell# logcat

    Opzioni

    La seguente tabella descrive le opzioni della riga di comando dilogcat.

    Opzione Descrizione
    -b <buffer> Caricare un alternativo per il log buffer per la visualizzazione, ad esempio events o radio. Il set di buffermainsystem ecrash viene utilizzato per impostazione predefinita. Vedere Visualizzazione di buffer di log alternativi.
    -c, --clear Cancella (flush) i buffer selezionati ed esci. Il set di buffer predefinito è mainsysteme crash. Per cancellare tutti i buffer, utilizzare -b all -c.
    -e <expr>, --regex=<expr> Stampa solo le righe in cui il messaggio di log corrisponde a <expr>dove <expr> è un’espressione regolare.
    -m <count>, --max-count=<count> Esci dopo la stampa <count> numero di righe. Questo è pensato per essere accoppiato con --regex, ma funzionerà da solo.
    --print Accoppiato con--regex e--max-count per consentire al contenuto di bypassare il filtro regex, ma comunque fermarsi al giusto numero di corrispondenze.
    -d Scarica il registro sullo schermo ed esce.
    -f <filename> Scrivi l’output del messaggio di log su<filename>. Il valore predefinito è stdout.
    -g, --buffer-size Stampa la dimensione del buffer di log specificato ed esce.
    -n <count> Imposta il numero massimo di log ruotati su<count>. Il valore predefinito è 4. Richiede l’opzione-r.
    -r <kbytes> Ruota il file di log ogni<kbytes> di output. Il valore predefinito è 16. Richiede l’opzione-f.
    -s Equivalente all’espressione di filtro'*:S', che imposta la priorità per tutti i tag su silent e viene utilizzata per precedere un elenco di espressioni di filtro che aggiungono contenuto. Per ulteriori informazioni, vai alla sezione Informazioni sul filtraggio dell’output del registro.
    -v <format> Imposta il formato di output per i messaggi di log. Il valore predefinito èthreadtime formato. Per un elenco dei formati supportati, vai alla sezione relativa al formato di output del registro di controllo.
    -D, --dividers Stampa i divisori tra ogni buffer di log.
    -c Svuota (cancella) l’intero log ed esci.
    -t <count> Stampa solo il numero di righe più recente. Questa opzione include la funzionalità-d.
    -t '<time>' Stampa le righe più recenti dal tempo specificato. Questa opzione include la funzionalità-d. Vedere l’opzione-P per informazioni sulla citazione dei parametri con spazi incorporati.

    adb logcat -t '01-26 20:52:41.820'
    -T <count> Stampa il numero di righe più recente dall’ora specificata. Questa opzione non include-d funzionalità
    -T '<time>' Stampa le righe più recenti dall’ora specificata. Questa opzione non include include -d funzionalità. Vedere l’opzione-P per informazioni sulla citazione dei parametri con spazi incorporati.

    adb logcat -t '01-26 20:52:41.820'
    -L, -last Scarica i log prima dell’ultimo riavvio.
    -B, --binary Genera il file binario di accesso.
    -S, --statistics Includi le statistiche nell’output per aiutarti a identificare e indirizzare gli spammer di log.
    -G <size> Imposta la dimensione del buffer dell’anello di log. Può aggiungere K o M alla fine per indicare kilobyte o megabyte.
    -p, --prune Stampa (leggi) la corrente di consentire (white) e negare (black elenchi e privo di argomenti, come segue:

    adb logcat -p
    -P '<list> ...'
    --prune '<list> ...' -P '<white_and_black_list>'
    Write (set) consenti (white) e negare (black) elenca per regolare il contenuto della registrazione per uno scopo specifico. Si fornisce un contenuto misto di voci di elenco permissed (<white>) e denied (~<black>), dove <white> o <black> può essere un UID, UID/PID o /PID. Con la guida delle statistiche logcat (logcat -S), si possono considerare le modifiche agli elenchi allow (white) e deny (black) per scopi come:

    • Dare la massima longevità a specifici contenuti di registrazione tramite selezioni UID.
    • Impedire a qualcuno (UID) o qualcosa (PID) di consumare queste risorse per aumentare il logspan in modo da poter avere più visibilità sui problemi che si stanno diagnosticando.

    Per impostazione predefinita, il sistema di registrazione impedisce automaticamente il peggior trasgressore nelle statistiche di registro in modo dinamico per fare spazio per nuovi messaggi di registro. Una volta esaurite le euristiche, il sistema pota le voci più vecchie per fare spazio ai nuovi messaggi.

    L’aggiunta di un allowlist (whitelist) protegge il tuo numero di identificazione Android (AID), che diventa l’AIUTO dei processi e GID dall’essere dichiarato colpevole, e l’aggiunta di un denylist aiuta a liberare spazio prima che vengano considerati i peggiori trasgressori. È possibile scegliere quanto è attiva la potatura e disattivare la potatura in modo che rimuova solo il contenuto dalle voci più vecchie in ciascun buffer di registro.

    Quotazioni

    adb logcat non mantiene le virgolette, in modo che la sintassi per la definizione di consentire (white) e negare (black) elenca come segue:

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

    L’esempio seguente specifica consentire (white) elenco con PID 32676 e UID 675, e nega (black) elenco con PID 32677 e UID 897. PID 32677 sul denylist è ponderato per una potatura più veloce.

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

    Altro (white) e negare (black) comando elenco variazioni che è possibile utilizzare sono i seguenti:

    ~! worst uid blacklist~1000/! worst pid in system (1000)
    --pid=<pid> ... Solo stampare i registri dal PID.
    --wrap Dormire per 2 ore o quando il buffer è in procinto di avvolgere a seconda di quale viene prima. Migliora l’efficienza del polling fornendo una sveglia di circa-to-wrap.

    Filtering log output

    • Il tag di un messaggio di log è una breve stringa che indica il componente di sistema da cui il messaggio ha origine (ad esempio, “View” per il sistema di visualizzazione).
    • La priorità è uno dei seguenti valori di carattere, ordinati dal più basso al più alto ordine di priorità:
      • V: Verbose (priorità più bassa)
      • D: Debug
      • I Info
      • W: Attenzione
      • E: Errore
      • F: Fatale
      • S: Silent (priorità più alta, in cui nulla è mai stampato)

    È possibile ottenere un elenco di tag utilizzati nel sistema, con priorità, eseguendo logcat e osservando le prime due colonne di ogni messaggio, dato come <priority>/<tag>.

    Di seguito è riportato un esempio di breve output logcat ottenuto con il comando logcat -v brief output. Mostra che il messaggio si riferisce al livello di priorità ” I “e tag”ActivityManager”:

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

    Per ridurre l’output del log a un livello gestibile, è possibile limitare l’output del log utilizzando le espressioni di filtro. Le espressioni di filtro consentono di indicare al sistema i tag-combinazioni di priorità che ti interessano — il sistema sopprime altri messaggi per i tag specificati.

    Un’espressione di filtro segue questo formato tag:priority ..., dove tag indica il tag di interesse e priority indica il livello minimo di priorità di report per il tag. I messaggi per quel tag in corrispondenza o al di sopra della priorità specificata vengono scritti nel registro. È possibile fornire qualsiasi numero di specifiche tag:priority in una singola espressione di filtro. La serie di specifiche è delimitata da spazi bianchi.

    Ecco un esempio di un’espressione di filtro che sopprime tutti i messaggi di registro tranne quelli con il tag “ActivityManager”, con priorità “Info” o superiore, e tutti i messaggi di registro con tag “MyApp”, con priorità “Debug” o superiore:

    adb logcat ActivityManager:I MyApp:D *:S

    L’elemento finale dell’espressione precedente,*:S, imposta il livello di priorità per tutti i tag su “silent”, garantendo così la visualizzazione solo dei messaggi di log con “ActivityManager” e “MyApp”. L’utilizzo di*:S è un modo eccellente per garantire che l’output del log sia limitato ai filtri specificati esplicitamente: consente ai filtri di fungere da allowlist per l’output del log.

    La seguente espressione di filtro visualizza tutti i messaggi di log con livello di priorità “warning” e superiore, su tutti i tag:

    adb logcat *:W

    Se si sta eseguendo logcat dal computer di sviluppo (rispetto all’esecuzione di un remoto adb shell), è anche possibile impostare un filtro di default espressione di esportazione di un valore per la variabile di ambiente ANDROID_LOG_TAGS:

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

    si noti che ANDROID_LOG_TAGS filtro non viene esportato l’emulatore/dispositivo di esempio, se si esegue logcat da una shell remota o l’utilizzo di adb shell logcat.

    Formato di output del registro di controllo

    I messaggi di registro contengono un numero di campi di metadati, oltre al tag e alla priorità. È possibile modificare il formato di output dei messaggi in modo che visualizzino un campo di metadati specifico. Per fare ciò, si utilizza l’opzione -v e si specifica uno dei formati di output supportati elencati di seguito.

    • brief: Visualizza priorità, tag e PID del processo che emette il messaggio.
    • long: Visualizza tutti i campi dei metadati e separa i messaggi con righe vuote.
    • process: Visualizza solo PID.
    • raw: Visualizza il messaggio di log non elaborato senza altri campi di metadati.
    • tag: Visualizza solo la priorità e il tag.
    • thread: Un formato legacy che mostra priorità, PID e TID del thread che emette il messaggio.
    • threadtime (default): Visualizza la data, l’ora di invocazione, la priorità, il tag, il PID e il TID del thread che emette il messaggio.
    • time: Visualizza la data, l’ora di invocazione, la priorità, il tag e il PID del processo che emette il messaggio.

    Quando avvio logcat, è possibile specificare il formato di output che si desidera utilizzando il -v opzioni:

     logcat 

    Ecco un esempio che mostra come generare i messaggi nel thread formato di output:

    adb logcat -v thread

    si noti che è possibile specificare un formato di output con il -v opzione, ma è possibile specificare come molti modificatori che senso. Logcat ignora i modificatori che non hanno senso.

    Modificatori di formato

    I modificatori di formato modificano l’output di logcat in termini di qualsiasi combinazione di uno o più dei seguenti modificatori. Per specificare un modificatore di formato, utilizzare l’opzione-v, come segue:

    adb logcat -b all -v color -d

    Ogni messaggio di registro Android ha un tag e una priorità ad esso associati. È possibile combinare qualsiasi modificatore di formato con una delle seguenti opzioni di formato: 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. Questo modificatore influisce solo sui messaggi del buffer del registro eventi e non ha alcun effetto sugli altri buffer non binari. Le descrizioni degli eventi provengono dal database event-log-tags.
    • epoch: Tempo di visualizzazione in secondi a partire dal 1 gennaio 1970.
    • monotonic: Tempo di visualizzazione in secondi della CPU a partire dall’ultimo avvio.
    • printable: Assicurarsi che qualsiasi contenuto di registrazione binario sia sfuggito.
    • uid: Se consentito dai controlli di accesso, visualizzare l’UID o l’ID Android del processo registrato.
    • usec: Visualizza il tempo con precisione fino a microsecondi.
    • UTC: Visualizza l’ora come UTC.
    • year: Aggiungi l’anno all’ora visualizzata.
    • zone: Aggiungere il fuso orario locale all’ora visualizzata.

    Visualizzazione di buffer di registro alternativi

    Il sistema di registrazione Android mantiene più buffer circolari per i messaggi di registro e non tutti i messaggi di registro vengono inviati al buffer circolare predefinito. Per visualizzare ulteriori messaggi di log, è possibile eseguire il comandologcat con l’opzione-b, per richiedere la visualizzazione di un buffer circolare alternativo. È possibile visualizzare uno di questi buffer alternativi:

    • radio: Visualizza il buffer che contiene messaggi relativi alla radio / telefonia.
    • events: Visualizza i messaggi interpretati del buffer degli eventi del sistema binario.
    • main: Visualizza il buffer di registro principale (predefinito) non contiene messaggi di registro di sistema e crash.
    • system: Visualizza il buffer del registro di sistema (predefinito).
    • crash: Visualizza il buffer del registro degli arresti anomali (predefinito).
    • all: Visualizza tutti i buffer.
    • default: Segnalamainsystemecrash buffer.

    L’utilizzo dell’opzione -b è:

     logcat 

    Ecco un esempio di come visualizzare un buffer di log contenente messaggi radio e telefonici:

    adb logcat -b radio

    È possibile indicare anche più di una -b bandiere per tutti i buffer che si desidera stampare, come segue:

    logcat -b main -b radio -b events

    È possibile specificare un singolo -b bandiera con un elenco separato da virgole di buffer, per esempio:

    logcat -b main,radio,events

    la Registrazione dal codice

    Log classe consente di creare voci di registro nel codice che visualizza il logcat strumento. I metodi di registrazione comuni includono:

    • 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

    Lascia un commento

    Il tuo indirizzo email non sarà pubblicato.