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?.
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.
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.
Sous Windows, vous pouvez faire:
adb logcat | findstr com.example.package
Ajouter un filtre
Spécifiez les noms
Choisissez votre filtre.
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
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
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:
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:
Tools
-> Android
-> Enable ADB Integration
.
S'il était déjà activé, désactivez-le, puis rallumez-le.
Débranchez et rebranchez votre appareil mobile.
Il existe également des options pour filtrer via regex et le niveau de débogage
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.
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
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.
Cela a fonctionné pour moi dans git bash:
$ pid=$(adb Shell ps | grep <package name> | cut -c11-15) ; adb logcat | grep $pid
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
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
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.
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.
Si vous utilisez Android Studio , vous pouvez sélectionner le processus à partir duquel vous souhaitez recevoir logcats. Voici la capture d'écran.
Cela fonctionne pour moi avec le débogage USB:
Connectez le périphérique et utilisez:
adb Shell
Simple utiliser le logcat:
logcat | grep com.youapp.packagename
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.
Donnez un nom à votre journal. J'ai appelé le mien "wawa".
Dans Android Studio, sélectionnez Android-> Modifier les configurations de filtre.
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:
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.
Essayez: Fenêtre -> Préférences -> Android -> LogCat. Changer le champ "Afficher la vue logcat si ..." la valeur "VERBOSE". Ça m'a aidé.
En variante, vous pouvez utiliser un script tiers PID Cat de Jake Wharton. Ce script présente deux avantages majeurs:
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.
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
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!
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.
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%
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"
Ubuntu: log adb -b tout -v couleur --pid = `adb Shell pidof -s com.packagename` Avec journal et journal continu de l'application
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`"
Il est maintenant possible de taper tag: nameofthetag ou app: nameoftheapp pour filtrer sans ajouter de nouveaux filtres à la barre de filtres enregistrée.
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.
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 .
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>]
Sous Linux, cela a fonctionné pour moi:
adb logcat | grep `adb Shell ps | grep your.package | awk '{print $2}'`