Logcat est un outil de ligne de commande qui vide un journal des messages système, y compris les traces de pile lorsque l’appareil génère une erreur et les messages que vous avez écrits à partir de votre application avec la classe Log
.
Cette page concerne l’outil logcat en ligne de commande, mais vous pouvez également afficher les messages-journaux à partir de la fenêtre Logcat dans Android Studio. Pour des informations sur l’affichage et le filtrage des journaux à partir d’Android Studio, consultez Écrire et afficher les journaux avecLogcat.
Aperçu du système de journalisation
Le système de journalisation Android est un ensemble de tampons circulaires structurés maintenus par le processus système logd
. L’ensemble des tampons disponibles est fixe et défini par le système. Les plus pertinents sont : main
, qui stocke la plupart des journaux d’application, system
, qui stocke les messages provenant du système d’exploitation Android, et crash
, qui stocke les journaux de plantage. Chaque entrée de journal a une priorité (l’une des valeurs suivantes : VERBOSE
DEBUG
INFO
WARNING
ERROR
ou FATAL
), une balise qui identifie l’origine du journal et le message de journal réel.
L’interface principale du système de journalisation est la bibliothèque partagée liblog
et son en-tête <android/log.h>
. Toutes les installations de journalisation spécifiques à la langue appellent finalement la fonction __android_log_write
. Par défaut, il appelle la fonction __android_log_logd_logger
, qui envoie l’entrée de journal à logd
à l’aide d’un socket. À partir du niveau API 30, la fonction de journalisation peut être modifiée en appelant __android_set_log_writer
. Plus d’informations sont disponibles dans la documentation NDK.
Les journaux affichés par adb logcat
subissent quatre niveaux de filtrage :
- Filtrage au moment de la compilation : selon les paramètres de compilation, certains journaux peuvent être complètement supprimés du binaire. Par exemple, Proguard peut être configuré pour supprimer les appels à
Log.d
du code Java. - Filtrage des propriétés système :
liblog
interroge un ensemble de propriétés système pour déterminer le niveau de gravité minimum à envoyer àlogd
. Si vos journaux ont la baliseMyApp
, les propriétés suivantes sont vérifiées et doivent contenir la première lettre de la gravité minimale (V
D
I
I
W
E
, ouS
pour désactiver tous les journaux) :
log.tag.MyApp
persist.log.tag.MyApp
log.tag
persist.log.tag
liblog
utilise la priorité minimale définie par __android_log_set_minimum_priority
. Le paramètre par défaut est INFO
.adb logcat
prend en charge des filtres supplémentaires qui peuvent réduire la quantité de journaux affichés à partir de logd
. Voir ci-dessous pour plus de détails.Syntaxe de ligne de commande
Pour exécuter logcat via le shell adb, l’utilisation générale est:
logcat ... ...
Vous pouvez exécuter logcat
en tant que commande adb ou directement dans une invite shell de votre émulateur ou de votre périphérique connecté. Pour afficher la sortie du journal à l’aide d’adb, accédez à votre répertoire SDK platform-tools/
et exécutez :
adb logcat
Pour l’aide en ligne logcat
, démarrez un périphérique, puis exécutez :
adb logcat --help
div>
Vous pouvez créer une connexion shell à un périphérique et exécuter:
$ adb shell# logcat
Options
Le tableau suivant décrit les options de ligne de commande de logcat
.
Option | Description |
---|---|
-b <buffer> |
Chargez un tampon de journal alternatif pour la visualisation, tel que events ou radio . Le jeu de tampons main system et crash est utilisé par défaut. Voir Affichage D’autres Tampons De Journaux. |
-c, --clear
|
Effacer (vider) les tampons sélectionnés et quitter. Le jeu de tampons par défaut est main system et crash . Pour effacer tous les tampons, utilisez -b all -c . |
-e <expr>, --regex=<expr> |
N’imprime que les lignes où le message de journal correspond à <expr> où <expr> est une expression régulière. |
-m <count>, --max-count=<count> |
Quitter après avoir imprimé <count> nombre de lignes. Ceci est destiné à être associé à --regex , mais fonctionnera seul. |
--print
|
Associé à --regex et --max-count pour permettre au contenu de contourner le filtre regex, tout en s’arrêtant au bon nombre de correspondances. |
-d
|
Videz le journal à l’écran et quittez. |
-f <filename>
|
Écrivez la sortie du message de journal sur <filename> . La valeur par défaut est stdout . |
-g, --buffer-size
|
Affiche la taille du tampon de journal spécifié et se termine. |
-n <count>
|
Définissez le nombre maximum de journaux pivotés sur <count> . La valeur par défaut est 4. Nécessite l’option -r . |
-r <kbytes>
|
Faites pivoter le fichier journal chaque <kbytes> de sortie. La valeur par défaut est 16. Nécessite l’option -f . |
-s |
Équivalent à l’expression de filtre '*:S' , qui définit la priorité de toutes les balises sur silent, et est utilisée pour précéder une liste d’expressions de filtre qui ajoutent du contenu. Pour en savoir plus, accédez à la section sur le filtrage de la sortie du journal. |
-v <format>
|
Définissez le format de sortie des messages de journal. Le format par défaut est threadtime . Pour une liste des formats pris en charge, accédez à la section sur le format de sortie du journal de contrôle. |
-D, --dividers
|
Imprime des diviseurs entre chaque tampon de journal. |
-c
|
Vider (effacer) tout le journal et quitter. |
-t <count>
|
Affiche uniquement le nombre de lignes le plus récent. Cette option inclut la fonctionnalité -d . |
-t '<time>'
|
Affiche les lignes les plus récentes depuis l’heure spécifiée. Cette option inclut la fonctionnalité -d . Reportez-vous à l’option -P pour plus d’informations sur la citation de paramètres avec des espaces intégrés.
adb logcat -t '01-26 20:52:41.820' |
-T <count> |
Affiche le nombre de lignes le plus récent depuis l’heure spécifiée. Cette option n’inclut pas -d fonctionnalité |
-T '<time>' |
Affiche les lignes les plus récentes depuis l’heure spécifiée. Cette option n’inclut pas la fonctionnalité include-d . Reportez-vous à l’option -P pour plus d’informations sur la citation de paramètres avec des espaces intégrés.
adb logcat -t '01-26 20:52:41.820' |
-L, -last |
Videz les journaux avant le dernier redémarrage. |
-B, --binary
|
Affiche le binaire de connexion. |
-S, --statistics
|
Incluez des statistiques dans la sortie pour vous aider à identifier et à cibler les spammeurs de journaux. |
-G <size>
|
Définit la taille du tampon d’anneau de journal. Peut ajouter K ou M à la fin pour indiquer les kilo-octets ou les mégaoctets. |
-p, --prune |
Imprime (lit) l’autorisation actuelle (white ) et le refus (black ) répertorie et ne prend aucun argument, comme suit:
adb logcat -p |
-P '<list> ...' |
Écrivez (définissez) les listes allow(white ) et deny(black ) pour ajuster le contenu de la journalisation pour un objectif spécifique. Vous fournissez un contenu mixte d’entrées de liste autorisées (<white> ) et refusées (~<black> ), où <white> ou <black> peut être un UID, UID/PID ou /PID. Avec les conseils des statistiques logcat (logcat -S ), on peut envisager des ajustements des listes autoriser (white ) et refuser (black ) à des fins telles que:
Par défaut, le système de journalisation empêche automatiquement le pire délinquant dans les statistiques de journal de faire de la place pour les nouveaux messages de journal. Une fois les heuristiques épuisées, le système taille les entrées les plus anciennes pour faire de la place aux nouveaux messages. L’ajout d’une liste d’autorisations ( Les guillemets
$ adb logcat -P '"<white_and_blacklist>"'oradb shell$ logcat -P '<white_and_blacklist>' L’exemple suivant spécifie une liste allow ( adb logcat -P '"/32676 675 ~/32677 897"' Autre autoriser ( ~! worst uid blacklist~1000/! worst pid in system (1000) |
--pid=<pid> ... |
N’imprime que les journaux à partir du PID donné. |
--wrap
|
Dormez pendant 2 heures ou lorsque le tampon est sur le point d’envelopper, selon la première éventualité. Améliore l’efficacité de l’interrogation en fournissant un réveil sur le point d’envelopper. |
Sortie de journal de filtrage
- La balise d’un message de journal est une chaîne courte indiquant le composant système d’où provient le message (par exemple, « View » pour le système de vue).
- La priorité est l’une des valeurs de caractères suivantes, classées de la priorité la plus basse à la priorité la plus élevée :
-
-
V
: Verbeux (priorité la plus basse) -
D
: Débogage -
I
:Info -
W
: Avertissement -
E
: Erreur -
F
: Fatal -
S
: Silencieux (priorité la plus élevée, sur lequel rien n’est jamais imprimé)
-
Vous peut obtenir une liste de balises utilisées dans le système, avec des priorités, en exécutant logcat et en observant les deux premières colonnes de chaque message, données sous la forme <priority>/<tag>
.
Voici un exemple de brève sortie logcat obtenue avec la commande logcat -v brief output
. Il montre que le message se rapporte au niveau de priorité « I » et à la balise « ActivityManager »:
I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}
Pour réduire la sortie du journal à un niveau gérable, vous pouvez restreindre la sortie du journal à l’aide d’expressions de filtre. Les expressions de filtre vous permettent d’indiquer au système les balises – combinaisons de priorités qui vous intéressent — le système supprime les autres messages pour les balises spécifiées.
Une expression de filtre suit ce format tag:priority ...
, où tag
indique la balise d’intérêt et priority
indique le niveau de priorité minimum à signaler pour cette balise. Les messages pour cette balise à ou au-dessus de la priorité spécifiée sont écrits dans le journal. Vous pouvez fournir n’importe quel nombre de spécifications tag:priority
dans une seule expression de filtre. La série de spécifications est délimitée par des espaces.
Voici un exemple d’expression de filtre qui supprime tous les messages de journal sauf ceux avec la balise « ActivityManager », à la priorité « Info » ou au-dessus, et tous les messages de journal avec la balise « MyApp », avec la priorité « Debug » ou au-dessus:
adb logcat ActivityManager:I MyApp:D *:S
Le dernier élément de l’expression ci-dessus, *:S
, définit le niveau de priorité de toutes les balises sur « silent », garantissant ainsi que seuls les messages de journal avec « ActivityManager » et « MyApp » sont affichés. L’utilisation de *:S
est un excellent moyen de s’assurer que la sortie du journal est limitée aux filtres que vous avez explicitement spécifiés — cela permet à vos filtres de servir de liste d’autorisation pour la sortie du journal.
L’expression de filtre suivante affiche tous les messages de journal avec un niveau de priorité » avertissement » et supérieur, sur toutes les balises:
adb logcat *:W
Si vous exécutez logcat depuis votre ordinateur de développement (plutôt que de l’exécuter sur un shell adb distant), vous pouvez également définir une expression de filtre par défaut en exportant une valeur pour la variable d’environnement ANDROID_LOG_TAGS
:
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
Notez que ANDROID_LOG_TAGS
:
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
ANDROID_LOG_TAGS
le filtre n’est pas exporté vers l’instance d’émulateur/périphérique, si vous exécutez logcat à partir d’un shell distant ou si vous utilisez adb shell logcat
.
Format de sortie du journal de contrôle
Les messages du journal contiennent un certain nombre de champs de métadonnées, en plus de la balise et de la priorité. Vous pouvez modifier le format de sortie des messages afin qu’ils affichent un champ de métadonnées spécifique. Pour ce faire, utilisez l’option -v
et spécifiez l’un des formats de sortie pris en charge répertoriés ci-dessous.
-
brief
: Affiche la priorité, la balise et le PID du processus émettant le message. -
long
: Affiche tous les champs de métadonnées et sépare les messages avec des lignes vides. -
process
: Afficher uniquement le PID. -
raw
: Affiche le message de journal brut sans autres champs de métadonnées. -
tag
: Affiche uniquement la priorité et la balise. -
thread:
Un format hérité qui affiche la priorité, le PID et le TID du thread émettant le message. -
threadtime
(par défaut) : Affiche la date, l’heure d’appel, la priorité, la balise, le PID et le TID du thread émettant le message. -
time
: Affiche la date, l’heure d’appel, la priorité, la balise et le PID du processus émettant le message.
Lors du démarrage de logcat, vous pouvez spécifier le format de sortie que vous souhaitez en utilisant l’option -v
:
logcat
Voici un exemple qui montre comment générer des messages dans thread
format de sortie:
adb logcat -v thread
Notez que vous ne pouvez spécifier qu’un seul format de sortie avec l’option -v
, mais vous pouvez spécifier autant de modificateurs qui ont du sens. Logcat ignore les modificateurs qui n’ont pas de sens.
Modificateurs de format
Les modificateurs de format modifient la sortie logcat en fonction de toute combinaison d’un ou plusieurs des modificateurs suivants. Pour spécifier un modificateur de format, utilisez l’option -v
, comme suit :
adb logcat -b all -v color -d
Chaque message de journal Android a une balise et une priorité qui lui est associée. Vous pouvez combiner n’importe quel modificateur de format avec l’une des options de format suivantes: 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. Ce modificateur affecte uniquement les messages de tampon du journal des événements et n’a aucun effet sur les autres tampons non binaires. Les descriptions d’événements proviennent de la base de données event-log-tags. -
epoch
: Temps d’affichage en secondes à partir du 1er janvier 1970. -
monotonic
: Temps d’affichage en secondes CPU à partir du dernier démarrage. -
printable
: Assurez-vous que tout contenu de journalisation binaire est échappé. -
uid
: Si les contrôles d’accès le permettent, affichez l’UID ou l’ID Android du processus enregistré. -
usec
: Affiche l’heure avec précision jusqu’à la microseconde. -
UTC
: Affiche l’heure en UTC. -
year
: Ajoute l’année à l’heure affichée. -
zone
: Ajoute le fuseau horaire local à l’heure affichée.
Affichage d’autres tampons de journal
Le système de journalisation Android conserve plusieurs tampons circulaires pour les messages de journal, et tous les messages de journal ne sont pas envoyés au tampon circulaire par défaut. Pour voir des messages de journal supplémentaires, vous pouvez exécuter la commande logcat
avec l’option -b
, pour demander l’affichage d’un tampon circulaire alternatif. Vous pouvez afficher n’importe lequel de ces tampons alternatifs :
-
radio
: Affiche le tampon contenant les messages liés à la radio/téléphonie. -
events
: Affiche les messages de tampon d’événements système binaires interprétés. -
main
: Afficher le tampon de journal principal (par défaut) ne contient pas de messages de journal système et de crash. -
system
: Afficher le tampon de journal système (par défaut). -
crash
: Affiche le tampon du journal des plantage (par défaut). -
all
: Affiche tous les tampons. -
default
: Signale les tamponsmain
system
etcrash
.
L’utilisation de l’option -b
est la suivante :
logcat
Voici un exemple de la façon d’afficher un tampon de journal contenant des messages radio et téléphoniques:
adb logcat -b radio
Vous pouvez également spécifier plusieurs drapeaux -b
pour tous les tampons que vous souhaitez imprimer, comme suit :
logcat -b main -b radio -b events
Vous pouvez spécifier un seul drapeau -b
avec un seul drapeau -b
liste de tampons séparés par des virgules, par exemple :
logcat -b main,radio,events
Journalisation à partir du code
La classe Log
vous permet de créer des entrées de journal dans votre code qui s’affichent dans l’outil logcat. Les méthodes de journalisation courantes incluent:
-
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