web-dev-qa-db-fra.com

Filtrer LogCat pour ne recevoir que les messages de Mon application sous Android?

J'ai constaté que lorsque j'utilise Logcat avec Eclipse avec ADT pour Android, je reçois également des messages de nombreuses autres applications. Existe-t-il un moyen de filtrer cela et d’afficher uniquement les messages de ma propre application?.

269
Vinod

Les noms de package sont garantis uniques et vous pouvez utiliser la fonction Log avec la balise comme nom de package, puis filtrer par nom de package :

REMARQUE: à partir de Build Tools 21.0.3, cela ne fonctionnera plus car les TAGS sont limités à 23 caractères ou moins.

Log.<log level>("<your package name>", "message");

adb -d logcat <your package name>:<log level> *:S

-d désigne un périphérique réel et -e désigne un émulateur. Si plus d'un émulateur est en cours d'exécution, vous pouvez utiliser -s emulator-<emulator number> (par exemple, -s emulator-5558).

Exemple: adb -d logcat com.example.example:I *:S

Ou, si vous utilisez System.out.print pour envoyer des messages au journal, vous pouvez utiliser adb -d logcat System.out:I *:S pour afficher uniquement les appels à System.out.

Vous pouvez trouver tous les niveaux de journalisation et plus d’informations ici: https://developer.Android.com/studio/command-line/logcat.html

http://developer.Android.com/reference/Android/util/Log.html

EDIT: On dirait que j’ai un peu sauté dans l’arme et que je viens de me rendre compte que vous posiez des questions sur logcat dans Eclipse. Ce que j'ai posté ci-dessus concerne l'utilisation de logcat via adb à partir de la ligne de commande. Je ne suis pas sûr que les mêmes filtres soient transférés dans Eclipse.

240
shanet

Linux et OS X

Utilisez ps/grep/cut pour récupérer le PID, puis grep pour les entrées logcat avec ce PID. Voici la commande que j'utilise:

adb logcat | grep -F "`adb Shell ps | grep com.example.package | cut -c10-15`"

(Vous pouvez améliorer davantage l'expression régulière pour éviter le problème théorique des lignes de journal non liées contenant le même nombre, mais cela ne m'a jamais posé problème)

Cela fonctionne également lors de la mise en correspondance de plusieurs processus.

Les fenêtres

Sous Windows, vous pouvez faire:

adb logcat | findstr com.example.package
318
Tom Mulcahy

Ajouter un filtre

Add filter

Spécifiez les noms

enter image description here

Choisissez votre filtre.

enter image description here

50
beryllium

Pour moi, cela fonctionne dans mac Terminal
Vous êtes dans le dossier où vous avez adb puis tapez la commande ci-dessous dans le terminal

./adb logcat MyTAG:V AndroidRuntime:E *:S

Ici, il filtre tous les journaux de MyTAG et AndroidRuntime

17

Depuis Android 7.0, logcat a l'option de filtrage --pid et que la commande pidof est disponible, remplacez com.example.app par le nom de votre package.
(terminal Ubuntu/Depuis Android 7.0)

adb logcat --pid=`adb Shell pidof -s com.example.app`

ou

adb logcat --pid=$(adb Shell pidof -s com.example.app)

Pour plus d'informations sur la commande pidof:
https://stackoverflow.com/a/15622698/7651532

14
You Kim

Mise à jour du 17 mai

Cela fait quelques années et les choses ont changé. Et Eclipse n'est plus officiellement pris en charge. Alors, voici deux approches plus récentes:

1. Studio Android

 enter image description here Dans la boîte à outils Android monitor, vous pouvez filtrer logcat par debuggable process. Normalement, lorsque vous développez une application, il s’agit d’un processus débogable. De temps en temps, j'ai des problèmes avec ceci et je fais ce qui suit:

  1. Tools -> Android -> Enable ADB Integration
    S'il était déjà activé, désactivez-le, puis rallumez-le.

  2. Débranchez et rebranchez votre appareil mobile.

Il existe également des options pour filtrer via regex et le niveau de débogage

2. logcat-color

C'est un wrapper python de Nice au-dessus de adb logcat si vous souhaitez utiliser une solution basée sur un terminal. L'avantage, c'est que vous pouvez enregistrer plusieurs configurations et les réutiliser simplement. Filtrer par tags est assez fiable. Vous pouvez également filtrer par package pour afficher les journaux d'une ou plusieurs applications uniquement, mais vous démarrez logcat-color juste avant de lancer votre application.

Ancienne réponse:

Il semble que je ne puisse pas commenter les réponses précédentes, je vais donc en poster une nouvelle . C'est un commentaire à la réponse de Tom Mulcahy, qui montre comment la commande devrait changer pour pouvoir fonctionner la plupart des périphériques, puisque la colonne adb Shell ps PID est variable.

NOTE: La commande ci-dessous fonctionne dans les cas où vous avez connecté plusieurs périphériques. Donc device id est nécessaire. Sinon, vous pouvez simplement omettre les crochets '[', ']'

1. Pour trouver la colonne de pid, tapez:

adb [-s DEVICE_ID] Shell ps | head -n 1

Maintenant, mémorisez le numéro de colonne du PID. La numérotation commence à partir de 1.

2. Tapez ensuite ce qui suit:

adb [-s DEVICE_ID] logcat | grep $(adb [-s DEVICE_ID] Shell ps \
| grep "com.example" | awk -F" " ' {print $PUT_COLUMN_HERE}')

Il suffit de mettre la colonne que vous avez mémorisée dans PUT_COLUMN_HERE, par exemple. $5

Caveat

Chaque fois que vous réexécutez votre application, vous devez réexécuter la deuxième commande, car l'application obtient un nouveau PID du système d'exploitation.

13
Paschalis

Cela a fonctionné pour moi dans git bash:

$ pid=$(adb Shell ps | grep <package name> | cut -c11-15) ; adb logcat | grep $pid
10
wubwubb

mettez ceci à applog.sh

#!/bin/sh
PACKAGE=$1
APPPID=`adb -d Shell ps | grep "${PACKAGE}" | cut -c10-15 | sed -e 's/ //g'`
adb -d logcat -v long \
 | tr -d '\r' | sed -e '/^\[.*\]/ {N; s/\n/ /}' | grep -v '^$' \
 | grep " ${APPPID}:"

alors: applog.sh com.example.my.package

9
Gavriel

J'ai écrit un script Shell pour filtrer logcat par nom de paquet, ce qui, à mon avis, est plus fiable que d'utiliser

ps | grep com.example.package | cut -c10-15

Il utilise/proc/$ pid/cmdline pour connaître le pid réel, puis fait un grep sur logcat

https://Gist.github.com/kevinxucs/7340e1b1dd2239a2b04a

7
kevin

ADT v15 pour Eclipse vous permet de spécifier un nom d'application (qui correspond en fait à la valeur du package dans votre fichier androidmanifest.xml).

J'adore pouvoir filtrer par application, mais le nouveau logcat a un bogue avec le défilement automatique. Lorsque vous faites légèrement défiler vers le haut pour consulter les journaux précédents, il revient automatiquement au bas de l'écran en quelques secondes. Il semble que faire défiler le journal à mi-hauteur l'empêche de revenir en bas, mais c'est souvent inutile.

EDIT: j'ai essayé de spécifier un filtre d'application à partir de la ligne de commande - mais pas de chance. Si quelqu'un découvre OR comment arrêter le défilement automatique, veuillez me le faire savoir.

6
Aaron T Harris

Utilisation de la commande Windows Invite: adb logcat -d | findstr <package>.

* Ceci a été mentionné pour la première fois par jj_ , mais il m'a fallu des siècles pour le trouver dans les commentaires.

6
rareclass

Si vous utilisez Android Studio , vous pouvez sélectionner le processus à partir duquel vous souhaitez recevoir logcats. Voici la capture d'écran.

enter image description here

6
dmSherazi

Cela fonctionne pour moi avec le débogage USB:

  1. Connectez le périphérique et utilisez: 

    adb Shell

  2. Simple utiliser le logcat:

    logcat | grep com.youapp.packagename

5
Lennoard Silva

Je ne suis pas sûr qu'il existe un moyen de voir uniquement les messages système concernant votre application, mais vous pouvez filtrer en fonction d'une chaîne. Si vous créez un journal dans le programme, vous pouvez simplement inclure un mot-clé unique et filtrer en fonction de ce mot.

2
bjpcomet

Donnez un nom à votre journal. J'ai appelé le mien "wawa". 

enter image description here

Dans Android Studio, sélectionnez Android-> Modifier les configurations de filtre. 

enter image description here

Puis tapez le nom que vous avez donné aux journaux. Dans mon cas, ça s'appelle "wawa". Voici quelques exemples de types de filtres que vous pouvez utiliser. Vous pouvez filtrer par System.out, System.err, les journaux ou les noms de package:

enter image description hereenter image description hereenter image description here

2
Gene

Si vous utilisez Eclipse, appuyez sur le signe green + dans la fenêtre logCat ci-dessous et indiquez le nom de votre package (com.example.votre nomapp) dans la zone by Nom de l'application. . Choisissez également un nom qui vous convient dans la zone Nom du filtre et cliquez sur OK. Vous ne verrez que les messages liés à votre application lorsque le filtre que vous venez d'ajouter est sélectionné dans le volet gauche du logCat.

2
Khaled Alanezi

Essayez: Fenêtre -> Préférences -> Android -> LogCat. Changer le champ "Afficher la vue logcat si ..." la valeur "VERBOSE". Ça m'a aidé.

2
Siruk Viktor

En variante, vous pouvez utiliser un script tiers PID Cat de Jake Wharton. Ce script présente deux avantages majeurs:

  • affiche les entrées de journal pour les processus d'un package d'application spécifique
  • couleur logcat

De la documentation:

Lors du développement d'applications, vous souhaitez souvent afficher uniquement les messages de journal provenant de votre application. Malheureusement, étant donné que l'ID de processus change chaque fois que vous déployez sur le téléphone, grep devient un défi pour la bonne chose. 

Ce script résout ce problème en filtrant par package d'application. 

Une sortie ressemble à  enter image description here

2
yoAlex5

Sur Windows 10, en utilisant Ionic, ce qui me convenait le mieux était de combiner "findstr" avec "INFO: CONSOLE" généré par tous les messages de l'application. Ainsi, ma commande en ligne de commande est:

adb logcat | findstr INFO:CONSOLE
2
Lud Akell

Utilisez simplement les filtres à l'intérieur du logcat. Il y a un bouton qui vous permet d'ajouter des filtres. Spécifiez simplement l'ID de l'application, assurez-vous qu'il est sélectionné par la suite, et vous avez terminé, c'est facile!

2
Gerard

Utilisez -s!

Vous devriez utiliser votre propre tag, regardez: http://developer.Android.com/reference/Android/util/Log.html

Comme. 

Log.d("AlexeysActivity","what you want to log");

Et puis, quand vous voulez lire le journal, utilisez> 

adb logcat -s AlexeysActivity

Cela filtre tout ce qui n'utilise pas la même balise.

La source

1
KrisWebDev

En plus de la réponse de Tom Mulcahy , si vous souhaitez filtrer par PID sur la console Windows, vous pouvez créer un petit fichier de commandes comme celui-ci:

@ECHO OFF

:: find the process id of our app (2nd token)
FOR /F "tokens=1-2" %%A IN ('adb Shell ps ^| findstr com.example.my.package') DO SET PID=%%B

:: run logcat and filter the output by PID
adb logcat | findstr %PID%
1
Lawyno

J'ai essayé d'utiliser la réponse de Tom Mulcahy, mais malheureusement, celle-ci ne fonctionnait pas pour les applications comportant plusieurs processus, je l'ai donc modifiée pour répondre à mes besoins.

#!/bin/bash
if [ "$#" -ne 1 ]; then echo "Illegal number of parameters"; exit 1; fi
echo "Lof for package name: $1"
PROCESSES=`adb Shell ps | grep "$1" | cut -c10-15`
NUM_OF_PROCESSES=`echo "$PROCESSES" | wc -l`
if [ $NUM_OF_PROCESSES -eq 0 ]; then echo "The application is not running!"; exit 1; fi
COUNTER=1
for process in $PROCESSES; do
        if [ $COUNTER -eq 1 ]; then GREP_TEXT="("; fi
        GREP_TEXT+=$process
        if [ $COUNTER -eq $NUM_OF_PROCESSES ]; then GREP_TEXT+=")"; else GREP_TEXT+="|"; fi
        let COUNTER=COUNTER+1 
        if [ $COUNTER -gt $NUM_OF_PROCESSES ]; then break; fi  
done
adb logcat | grep -E "$GREP_TEXT"
1
Ahmed Hegazy

Ubuntu: log adb -b tout -v couleur --pid = `adb Shell pidof -s com.packagename` Avec journal et journal continu de l'application

1
Sandeep PC

C'est probablement la solution la plus simple. 

En plus d’une solution de Tom Mulcahy, vous pouvez la simplifier davantage comme ci-dessous:

alias logcat="adb logcat | grep `adb Shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"

L'utilisation est facile comme un alias normal. Il suffit de taper la commande dans votre shell:

logcat

La configuration des alias le rend pratique. Et l'expression rationnelle le rend robuste pour les applications multi-processus, en supposant que vous vous souciez uniquement du processus principal. 

Bien sûr, vous pouvez définir plus d'alias pour chaque processus à votre guise. Ou utilisez la solution de hegazy. :)

En outre, si vous souhaitez définir des niveaux de journalisation, il est

alias logcat-w="adb logcat *:W | grep `adb Shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"
1
Frank Du

Il est maintenant possible de taper tag: nameofthetag ou app: nameoftheapp pour filtrer sans ajouter de nouveaux filtres à la barre de filtres enregistrée.

0
Fernando Gallego

Dans intelliJ (et probablement aussi dans Eclipse également), vous pouvez filtrer la sortie de logcat par text webview , afin d’imprimer pratiquement tout ce que phonegap produit.

0

C’est évidemment une question qui concerne l’utilisation de Logcat à partir de extérieur du périphérique développeur, mais si vous souhaitez afficher la sortie Logcat sur le périphérique (par programme), vous avez simplement besoin de ceci:

Runtime.getRuntime().exec("logcat " + Android.os.Process.myPid() + " *:D");

Le *:D à la fin filtre tous les messages sous le niveau du journal de débogage, mais vous pouvez le laisser.

Pour diriger la sortie vers, par exemple, un TextView, voir par exemple ici .

0
Tom Ladek

Encore une autre variante du applog.sh de Gavriel prenant en charge plusieurs périphériques et applications avec plusieurs processus:

#!/bin/sh
PKG=$1
shift

APPIDS=`adb $@ Shell ps | awk -v PKG="$PKG" '
    (NR == 1){appcolumn=2; for (i=1; i<=NF; i++) if ($i=="PID") {appcolumn=i}}
    index($0,PKG){print $(appcolumn)}' | paste -d \| -s`

echo "PID's: $APPIDS"
adb $@ logcat -v color | awk  "(\$3 ~ /$APPIDS/){print \$0}"

Utilisation: applog.sh com.example.my.package [-s <specific device>]

0
ls.illarionov

Sous Linux, cela a fonctionné pour moi:

adb logcat | grep `adb Shell ps | grep your.package | awk '{print $2}'`
0
spectralsun