Maybaygiare.org

Blog Network

Outil de ligne de commande Logcat

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 : VERBOSEDEBUGINFOWARNINGERROR 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 :

  1. 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.
  2. 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 balise MyApp, les propriétés suivantes sont vérifiées et doivent contenir la première lettre de la gravité minimale (VDIIWE, ou S pour désactiver tous les journaux) :
  • log.tag.MyApp
  • persist.log.tag.MyApp
  • log.tag
  • persist.log.tag
  • Filtrage des applications: Si aucune des propriétés n’est définie, liblog utilise la priorité minimale définie par __android_log_set_minimum_priority. Le paramètre par défaut est INFO.
  • Filtrage d’affichage: 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 mainsystem 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 mainsystem 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><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 -dfonctionnalité
    -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> ...'
    --prune '<list> ...' -P '<white_and_black_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:

    • Donner la plus grande longévité à un contenu de journalisation spécifique via des sélections d’UID.
    • Empêchez quelqu’un (UID) ou quelque chose (PID) de consommer ces ressources pour aider à augmenter l’espace de connexion afin que vous puissiez avoir plus de visibilité sur les problèmes que vous diagnostiquez.

    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 (whitelist) protège votre numéro d’identification Android (AID), qui devient l’AIDE des processus et le GID d’être déclaré délinquant, et l’ajout d’une liste de refus permet de libérer de l’espace avant que les pires délinquants ne soient considérés. Vous pouvez choisir à quel point l’élagage est actif et vous pouvez désactiver l’élagage afin qu’il ne supprime que le contenu des entrées les plus anciennes de chaque tampon de journal.

    Les guillemets

    adb logcatne conserve pas les guillemets, donc la syntaxe pour spécifier les listes allow(white) et deny(black) est la suivante:

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

    L’exemple suivant spécifie une liste allow (white) avec PID 32676 et UID 675, et une liste deny (black) avec PID 32677 et UID 897. Le PID 32677 sur la liste de refus est pondéré pour une taille plus rapide.

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

    Autre autoriser (white) et refuser (black) les variations de commande de liste que vous pouvez utiliser sont les suivantes:

    ~! 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 threadformat 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: 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. 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 tampons mainsystem et crash.

    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

    Laisser un commentaire

    Votre adresse e-mail ne sera pas publiée.