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 alogd
. Se i log contengono il tagMyApp
, le seguenti proprietà sono state controllate e dovrebbero contenere la prima lettera della gravità minima (V
,D
,I
,W
,E
oS
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 dalogd
. 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
: debugI
: informazioniW
: avvisoE
: erroreF
: irreversibileS
: 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
: reportmain
,system
e buffercrash
.
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:
Log.v(String, String)
(dettagliato)Log.d(String, String)
(debug)Log.i(String, String)
(informazioni)Log.w(String, String)
(avviso)Log.e(String, String)
(errore)
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