Strumento a riga di comando Logcat

Logcat è uno strumento a riga di comando che esegue il dump di un log di messaggi di sistema, di messaggi che hai scritto dalla tua app con Log corso.

Questa pagina riguarda lo strumento a riga di comando logcat, ma puoi anche visualizzare il log nella finestra Logcat di Android Studio. Per informazioni su come visualizzare e filtrare i log di Android Studio, consulta Visualizzare e scrivere i log con Logcat.

Panoramica del sistema di logging

Il sistema di logging di Android è un insieme di buffer circolari strutturati gestiti dal sistema processo logd. L'insieme di buffer disponibili è fisso e definito dalla di un sistema operativo completo. I buffer più rilevanti sono:

  • main: archivia la maggior parte dei log delle applicazioni.
  • system: archivia i messaggi provenienti dal sistema operativo Android.
  • crash: archivia i log degli arresti anomali. Ogni voce di log ha una priorità, un tag che identifica l'origine del log e il messaggio di log effettivo.

L'interfaccia C/C++ principale del sistema di logging è la libreria condivisa liblog e la relativa intestazione <android/log.h>. Tutte le strutture di logging specifiche per lingua (incluso android.util.Log) alla fine chiameremo la funzione __android_log_write. Per impostazione predefinita, chiama la funzione __android_log_logd_logger, che invia la voce di log a logd utilizzando una presa. A partire dal livello API 30, la funzione di logging può essere modificata chiamando __android_set_log_writer. Ulteriori informazioni sono disponibili nel Documentazione NDK.

I log visualizzati da adb logcat vengono filtrati in quattro livelli:

Filtro in fase di compilazione
A seconda delle impostazioni di compilazione, alcuni log potrebbero essere completamente rimosso dal file binario. Ad esempio, ProGuard può essere configurato per rimuovere le chiamate a Log.d dal codice Java.
Filtro proprietà di sistema
liblog esegue query su un insieme di proprietà di sistema per determinare il livello di gravità minimo da inviare a logd. Se i log contengono il tag MyApp, le seguenti proprietà sono state controllate e dovrebbero contenere la prima lettera della gravità minima (V, D, I, W, E o S per disattivare tutti i log):
  • log.tag.MyApp
  • persist.log.tag.MyApp
  • log.tag
  • persist.log.tag
Filtro delle applicazioni
Se nessuna delle proprietà è impostata, liblog utilizza la priorità minima impostata da __android_log_set_minimum_priority. L'impostazione predefinita è INFO.
Filtro visualizzazione
adb logcat supporta filtri aggiuntivi che possono ridurre la quantità di log mostrata da logd. Consulta la sezione su filtrando l'output dei log per ulteriori dettagli.

Sintassi della riga di comando

Per eseguire logcat tramite la shell adb, l'utilizzo generale è:

[adb] shell logcat [<option>] ... [<filter-spec>] ...

Esiste anche una forma abbreviata di adb logcat, ma questa si espande in adb shell logcat.

Opzioni

logcat ha molte opzioni. Le opzioni disponibili dipendono dal sistema operativo del dispositivo in uso. Per visualizzare la guida specifica per logcat dispositivo che stai utilizzando, esegui:

    adb logcat --help
    

Tieni presente che, poiché logcat è uno strumento sia per gli sviluppatori di sistemi operativi sia per quelli di app, (con gli sviluppatori di app che dovrebbero usare Android Studio), molte delle opzioni sono disponibili utilizzabili come root.

Filtra output log

Il tag di un messaggio di log è una breve stringa che indica il componente di sistema in cui il messaggio di errore. Ad esempio, "Visualizza" per il sistema di visualizzazione.

La priorità è uno dei seguenti valori di carattere, ordinati dal più basso al più alto priorità:

    • V: dettagliato (priorità più bassa)
    • D: debug
    • I: informazioni
    • W: avviso
    • E: errore
    • F: irreversibile
    • S: silenzioso (priorità massima, dove non viene mai stampato nulla)
  • Per ottenere un elenco dei tag utilizzati nel sistema con priorità, esegui logcat e osserva le prime due colonne di ogni messaggio, indicate come <priority>/<tag>.

    Di seguito è riportato un esempio di un breve output di logcat ottenuto con Comando logcat -v brief output. L'output mostra che il messaggio è correlato 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, limita l'output del log utilizzando espressioni. Le espressioni di filtro ti permettono di indicare al sistema la priorità dei tag combinazioni che ti interessano. Il sistema elimina gli altri messaggi relativi 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 la priorità da segnalare per quel tag. I messaggi relativi al tag con priorità uguale o superiore a quella specificata vengono scritte nel log. Fornisci un numero qualsiasi di specifiche tag:priority in un singola espressione di filtro. La serie di specifiche è delimitata da spazi vuoti.

    Di seguito è riportato un esempio di espressione di filtro che elimina tutti i messaggi di log tranne quelli con il tag "ActivityManager" con priorità "Informazioni" o superiore e quelli con il tag "Miaapp" con priorità "Debug" o superiore:

    adb logcat ActivityManager:I MyApp:D *:S
    

    L'elemento finale nell'espressione precedente, *:S, imposta il livello di priorità per tutti i tag vengono impostati su "silenzioso", assicurando che vengano registrati soltanto i messaggi con "ActivityManager" e "Miaapp" sono visualizzati. L'utilizzo di *:S garantisce che l'output di log sia limitato a i filtri che hai specificato in modo esplicito. *:S consente ai filtri di fungere da lista consentita per l'output dei log.

    Nota: in alcune shell, la colonna "*" è riservato alla shell. Se utilizzi una shell di questo tipo, racchiudi l'espressione di filtro tra virgolette: adb logcat "ActivityManager:I MyApp:D *:S"

    La seguente espressione di filtro visualizza tutti i messaggi di log con livello di priorità "warning" e più in alto rispetto a tutti i tag:

    adb logcat *:W
    

    Se esegui logcat dal tuo computer di sviluppo anziché eseguirlo su un shell adb remota, puoi anche impostare un'espressione di filtro predefinita esportando un valore per variabile di ambiente ANDROID_LOG_TAGS:

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

    Il filtro ANDROID_LOG_TAGS non è stato esportato nell'emulatore/nel dispositivo se esegui logcat da una shell remota o utilizzi adb shell logcat.

    Formato di output del log di controllo

    I messaggi di log contengono una serie di campi di metadati oltre al tag e alla priorità. Puoi modificare il formato di output dei messaggi in modo da visualizzare un campo di metadati specifico. Per farlo, Utilizza l'opzione -v e specifica uno dei seguenti formati di output supportati:

    • brief: mostra la priorità, il tag e il PID del processo che emette il parametro .
    • long: visualizza tutti i campi dei metadati e i messaggi separati con uno spazio vuoto linee.
    • process: mostra solo il PID.
    • raw: visualizza il messaggio di log non elaborato senza altri campi di metadati.
    • tag: mostra solo la priorità e il tag.
    • thread: Un formato precedente che mostra priorità, PID e TID del che emette il messaggio.
    • threadtime (predefinito): visualizza la data, l'ora di chiamata, la priorità il tag, il PID e il TID del thread che emette il messaggio.
    • time: visualizza la data, l'ora di chiamata, la priorità, il tag e il PID del che invia il messaggio.

    Quando avvii logcat, specifica il formato di output desiderato utilizzando il metodo Opzione -v:

    [adb] logcat [-v <format>]
    

    Ecco un esempio che mostra come generare messaggi nell'output thread formato:

    adb logcat -v thread
    

    Puoi specificare un solo formato di output con l'opzione -v. Tuttavia, puoi specificare tutti i modificatori di cui hai bisogno, a condizione che abbiano senso. logcat ignora i modificatori privi di senso.

    Modificatori di formato

    I modificatori di formato modificano l'output logcat. Per specificare un modificatore di formato, utilizza l'opzione -v, come segue:

    adb logcat -b all -v color -d
    

    A ogni messaggio di log di Android è associato un tag e una priorità. Puoi combinare qualsiasi modificatore di formato con una delle seguenti opzioni di formato:

    • brief
    • long
    • process
    • raw
    • tag
    • thread
    • threadtime
    • time

    Per formattare i seguenti dettagli del modificatore, inserisci logcat -v --help in la riga di comando:

    • color: mostra ogni livello di priorità con un colore diverso.
    • descriptive: mostra le descrizioni degli eventi del buffer di log. Questo modificatore influisce sull'evento e non ha effetto sugli altri buffer non binari. L'evento le descrizioni provengono dal database di event-log-tags.
    • epoch: mostra il tempo in secondi a partire dal 1° gennaio 1970.
    • monotonic: mostra il tempo in secondi della CPU a partire dall'ultimo avvio.
    • printable: assicura che tutti i contenuti di log binari contengano i caratteri di escape.
    • uid: se consentito dai controlli di accesso, mostra l'UID o l'ID Android dell'attributo processo registrato.
    • usec: mostra l'ora con la precisione in microsecondi.
    • UTC: l'ora viene visualizzata nel formato UTC.
    • year: aggiunge l'anno all'ora visualizzata.
    • zone: aggiunge il fuso orario locale all'ora visualizzata.

    Visualizza buffer di log alternativi

    Il sistema di logging di Android conserva più buffer circolari per i messaggi di log e non tutti i messaggi di log vengono inviati al buffer circolare predefinito. Per visualizzare altri messaggi di log, esegui il comando logcat con l'opzione -b per richiedere la visualizzazione di un un buffer circolare alternativo. Puoi visualizzare uno qualsiasi di questi buffer alternativi:

    • radio: visualizza il buffer che contiene contenuti correlati a radio/telefonia messaggi.
    • events: visualizza i messaggi del buffer degli eventi del sistema binario interpretati.
    • main: visualizza il buffer di log principale (impostazione predefinita), che non contiene messaggi di sistema e di log degli arresti anomali.
    • system: visualizza il buffer dei log di sistema (impostazione predefinita).
    • crash: visualizza il buffer del log degli arresti anomali (impostazione predefinita).
    • all: visualizza tutti i buffer.
    • default: report main, system e buffer crash.

    L'utilizzo dell'opzione -b è:

    [adb] logcat [-b <buffer>]
    

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

    adb logcat -b radio
    

    Per specificare più flag -b per tutti i buffer che vuoi stampare, inserisci quanto segue:

    logcat -b main -b radio -b events
    

    Specifica un singolo flag -b con un elenco di buffer separati da virgole, Ad esempio:

    logcat -b main,radio,events
    

    Accedi dal codice

    Il corso Log ti consente di creare di log nel tuo codice visualizzate nello strumento logcat. I metodi di logging più comuni includono:

    Ad esempio, utilizzando la seguente chiamata:

    Kotlin

    Log.i("MyActivity", "MyClass.getView() — get item number $position")
    

    Java

    Log.i("MyActivity", "MyClass.getView() — get item number " + position);
    

    logcat restituisce un output simile al seguente:

    I/MyActivity( 1557): MyClass.getView() — get item number 1