¿Filtrar LogCat para obtener solo los mensajes de Mi aplicación en Android?

340

Observé que cuando uso Logcat con Eclipse con ADT para Android, también recibo mensajes de muchas otras aplicaciones. ¿Hay alguna manera de filtrar esto y mostrar solo mensajes de mi propia aplicación solamente?

Vinod
fuente
1
Todas las respuestas sugieren filtrar los mensajes de la aplicación que se está depurando. Incluso con estos filtros activados, el spam de Logcat de otras aplicaciones pronto llena el búfer de registro sin importar cuán grande sea. ¿Hay alguna manera de decirle a Eclipse que no recopile estos mensajes o que los elimine periódicamente?
Precio

Respuestas:

267

Se garantiza que los nombres de los paquetes serán únicos, por lo que puede usar la Logfunción con la etiqueta como nombre del paquete y luego filtrar por nombre del paquete :

NOTA: A partir de Build Tools 21.0.3 esto ya no funcionará ya que las TAGS están restringidas a 23 caracteres o menos.

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

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

-ddenota un dispositivo real y -edenota un emulador. Si hay más de 1 emulador en ejecución, puede usar -s emulator-<emulator number>(por ejemplo, -s emulator-5558)

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

O si está utilizando System.out.printpara enviar mensajes al registro, puede utilizar adb -d logcat System.out:I *:Spara mostrar solo llamadas a System.out.

Puede encontrar todos los niveles de registro y más información aquí: https://developer.android.com/studio/command-line/logcat.html

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

EDITAR: Parece que salté un poco el arma y me di cuenta de que estabas preguntando sobre logcat en Eclipse. Lo que publiqué anteriormente es para usar logcat a través de adb desde la línea de comandos. No estoy seguro de si los mismos filtros se transfieren a Eclipse.

shanet
fuente
10
Sé que la pregunta era sobre eclipse, pero estoy enamorado de la línea de comandos y siempre la uso también para logcat. También use algunas herramientas para colorear el resultado como jsharkey.org/blog/2009/04/22/… lo hace aún más útil
Francisco Jordano
1
Prueba en el emulador: se me quedó bloqueado cuando ejecuté adb -e logcat com.example.example: I *: S, adb -d logcat System.out: I *: S funcionando.
Código de
1
@ Shubh ¿Qué quieres decir con que estaba atascado? Publiqué esto hace casi un año, por lo que algo en Logcat puede haber cambiado desde entonces.
shanet
58
Este método filtra por etiqueta, no por aplicación. El método de Tom filtra por aplicación
Jonas Alves
17
Al usar logcat <your package name>:<log level>la respuesta, se sugiere que es posible usar el nombre del paquete como filtro válido. Necesitaba leer la respuesta dos veces para comprender lo que en realidad dice, por lo tanto, recomiendo simplemente cambiar la primera línea a algo así como "¿ logcat <tag>:<log level>dónde <tag>puede estar el nombre de su paquete si también lo usó como etiqueta android.util.Log"
Flujo
368

Linux y OS X

Use ps / grep / cut para tomar el PID, luego grep para las entradas logcat con ese PID. Aquí está el comando que uso:

adb logcat | grep -F "`adb shell ps | grep com.asanayoga.asanarebel  | tr -s [:space:] ' ' | cut -d' ' -f2`"

(Podría mejorar aún más la expresión regular para evitar el problema teórico de las líneas de registro no relacionadas que contienen el mismo número, pero nunca ha sido un problema para mí)

Esto también funciona cuando se combinan múltiples procesos.

Ventanas

En Windows puedes hacer:

adb logcat | findstr com.example.package
Tom Mulcahy
fuente
2
@BTRNaidu: Puede instalar Cygwin o usar git-bash (bash para windows)
Phillip
1
pid=$(adb shell ps | grep "package-name" | cut -c10-15) && adb logcat | grep $pid
VishalKale
1
a veces gc imprime el mismo número con el número pid de un proceso cuando hay memoria libre. aquí hay otra versiónadb logcat | grep `adb shell ps | grep org.videolan.vlc | awk '{print $2")"}'`
alijandro
14
En Windows puede hacer:adb logcat | findstr com.example.package
jj_
8
Solo un pequeño cambio en su respuesta. Sugeriría:adb logcat | grep `adb shell ps | grep com.example.package | tr -s [:space:] ' ' | cut -d' ' -f2`
hiepnd
59

Desde Android 7.0, logcat tiene la opción de filtro --pid, y el comando pidof está disponible, reemplace com.example.app por el nombre de su paquete.
(Terminal ubuntu / Desde Android 7.0)

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

o

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

Para obtener más información sobre el comando pidof:
https://stackoverflow.com/a/15622698/7651532

Tu kim
fuente
2
Intenté todas las opciones grepy findstr, pero solo están filtrando registros con algún valor, excluyendo muchos mensajes. Su respuesta es la verdadera, muestre todo el registro sobre la aplicación sin excluir el mensaje de registro de otras bibliotecas. Es como el filtro actual 'Mostrar solo los seleccionados' de Android Studio. ¡Gracias!
equiman
Estos 2 comandos funcionan mientras el proceso "com.example.app" se esté ejecutando. Sin embargo, aparecerán mensajes de error si el proceso no se está ejecutando. Solo una nota al margen para evitar sorpresas.
Jonathan el
53

Añadir filtro

Añadir filtro

Especificar nombres

ingrese la descripción de la imagen aquí

Elige tu filtro.

ingrese la descripción de la imagen aquí

berilio
fuente
3
Es muy importante ser preciso al diseñar herramientas de desarrollo, ya que se espera que el usuario sea preciso. Ese es el nombre del paquete, no el nombre de la aplicación. > :(
Henrik Erlandsson
19

Para mí, esto funciona en Mac. Terminal
Llegué a la carpeta donde tiene que adbescribir el siguiente comando en la terminal

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

Aquí filtrará todos los registros MyTAGyAndroidRuntime

Inder Kumar Rathore
fuente
2
1) Código Java: Log.d("MyTAG", "i am hero"); Log.d("AndroidRunTime", "i am zero");2) DEPURAR iniciar sesión en Android $ adb -s RKSCWSOV5SAIEUSC shell;3) $ logcat MyTAG:V AndroidRuntime:E *:S 4) ahora mostrará detallado de MyTAG y errores de AndroidRuntime
1
Esta es la única respuesta que me funcionó en MacOS. Gran trabajo.
om-ha
1
@ om-ha gracias, utilicé Studio hace mucho tiempo y no sabía que todavía tiene el problema
Inder Kumar Rathore
1
De hecho, no estoy usando Android Studio. Estoy usando Flutter, Android SDK y Gradle. Como editor, VS Code. Así que esta es una excelente manera de saber qué está pasando en mi teléfono Android
om-ha
13

Actualización 17 de mayo

Han pasado algunos años, y las cosas han cambiado. Y Eclipse ya no es oficialmente compatible. Aquí hay dos enfoques más actualizados:

1. Android Studio

ingrese la descripción de la imagen aquí En la Android monitorcaja de herramientas, puede filtrar logcat por debuggable process. Normalmente, cuando desarrolla una aplicación, es un proceso depurable. De vez en cuando tengo problemas con esto, y hago lo siguiente:

  1. Tools-> Android-> Enable ADB Integration.
    Si ya estaba habilitado, apague y vuelva a encender

  2. Desenchufe y vuelva a conectar su dispositivo móvil.

También hay opciones para filtrar a través de expresiones regulares y el nivel de depuración

2. logcat-color

Este es un buen contenedor de Python además de adb logcatsi desea usar una solución basada en terminal. Lo bueno de esto es que puede guardar múltiples configuraciones y simplemente reutilizarlas. Filtrar por tagses bastante confiable. También puede filtrar por packagepara ver registros de una o más aplicaciones solamente, pero comienza logcat-colorjusto antes de iniciar su aplicación.

Vieja respuesta:

Parece que no puedo comentar las respuestas anteriores, por lo que publicaré una nueva. Este es un comentario a la respuesta de Tom Mulcahy , que muestra cómo debe cambiar el comando para que funcione en la mayoría de los dispositivos, ya que la adb shell pscolumna PID es variable.

NOTA: El siguiente comando funciona para los casos en los que ha conectado muchos dispositivos. Entonces device ides necesario. De lo contrario, simplemente puede omitir los corchetes '[', ']'

1. Para averiguar la columna de pid, escriba:

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

Ahora memorice el número de columna para el PID. La numeración comienza desde 1.

2. Luego escriba lo siguiente:

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

Simplemente ponga la columna que memorizó PUT_COLUMN_HERE, p. Ej.$5

Consideración

Cada vez que vuelve a ejecutar su aplicación, debe volver a ejecutar el segundo comando, porque la aplicación obtiene un nuevo PID del sistema operativo.

Paschalis
fuente
Mira todas estas cosas que tienes que hacer solo para obtener registros de tu aplicación, no de otras aplicaciones. Además, realmente me parece ridículo que otras personas puedan ver los registros de otras personas. ¿Me estás diciendo que no hay nada que Google pueda hacer al respecto? ¿Solo asegúrese de que mis registros no sean vistos por otras personas y mantenga mi logcat limpio?
TatiOverflow
10

Esto ha estado funcionando para mí en git bash:

$ pid=$(adb shell ps | grep <package name> | cut -c11-15) ; adb logcat | grep $pid
wubwubb
fuente
¿Es posible usarlo en el código de Android?
niko1312
9

poner esto a 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}:"

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

Gavriel
fuente
Aquí hay una variación del filtro para capturar registros de varias líneas ( si lo ha hecho, log.d("TAG", "multine\nlog")por ejemplo): adb -d logcat -v long | sed -Ene '/^\[.*'" (${APPID}):"'.*\]/ { N; s/\n/ /; p; :a;' -e 'n; p; s/^.+$/foo/; t a;' -e ' }' | grep -v '^$'- Dejé el tr, supongo que es necesario en los sistemas Windows, y envolví el APPIDparéntesis para permitir múltiples pids (separados por |) .
Recogida de Logan el
9

Esto funciona para mí con la depuración de USB:

  1. Conecte el dispositivo y use:

    adb shell

  2. Use el logcat cuando esté conectado:

    logcat | grep com.yourapp.packagename

Lennoard Silva
fuente
7

Si está utilizando Android Studio , puede seleccionar el proceso desde el que desea recibir logcats. Aquí está la captura de pantalla.

ingrese la descripción de la imagen aquí

dmSherazi
fuente
1
a partir de android studio ver 0.4.5 obtendrá mensajes de la aplicación que solo se está ejecutando. Log cat has a new option (on by default) which creates an application filter automatically such that only the launched application's output is shown
dmSherazi
7

Escribí un script de shell para filtrar logcat por nombre de paquete, que creo que es más confiable que usar

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

Utiliza / proc / $ pid / cmdline para averiguar el pid real, luego hace un grep en logcat

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

Kevin
fuente
7

Ubuntu: adb logcat -b all -v color --pid = `adb shell pidof -s com.packagename` Con color y registro continuo de la aplicación

PC Sandeep
fuente
El adb shell pidof ...bit no funcionó para mí, así que adb shellingresé al dispositivo y ejecuté la topcopia del PID de mi aplicación allí y luego lo reemplacé en su comando
edzillion
probar en pgreplugar de pidof
Lennoard Silva
Esto funciona para mí en OSX, puntos extra para -v color
Marte
6

ADT v15 para Eclipse le permite especificar un nombre de aplicación (que en realidad es el valor del paquete en su androidmanifest.xml).

Me encanta poder filtrar por aplicación, pero el nuevo logcat tiene un error con el desplazamiento automático. Cuando se desplaza un poco hacia arriba para ver los registros anteriores, se desplaza automáticamente hacia abajo en unos segundos. Parece que desplazarse 1/2 camino hacia arriba del registro evita que salte al fondo, pero a menudo eso es inútil.

EDITAR: intenté especificar un filtro de aplicación desde la línea de comandos, pero no tuve suerte. Si alguien resuelve esto O cómo detener el desplazamiento automático, hágamelo saber.

Aaron T Harris
fuente
6

Que utilizan Windows símbolo del sistema: adb logcat -d | findstr <package>.

* Esto fue mencionado por primera vez por jj_ , pero me llevó años encontrarlo en los comentarios ...

clase rara
fuente
4

Como variante, puede utilizar el script PID Cat de terceros de Jake Wharton. Este script tiene dos ventajas principales:

  • muestra entradas de registro para procesos de un paquete de aplicación específico
  • logcat de color

De la documentación:

Durante el desarrollo de la aplicación, a menudo solo desea mostrar mensajes de registro provenientes de su aplicación. Desafortunadamente, debido a que el ID del proceso cambia cada vez que lo implementa en el teléfono, se convierte en un desafío para buscar lo correcto.

Este script resuelve ese problema al filtrar por paquete de aplicación.

Una salida se parece a ingrese la descripción de la imagen aquí

yoAlex5
fuente
2

No estoy seguro de que haya una manera de ver solo los mensajes del sistema con respecto a su aplicación, pero puede filtrar según una cadena. Si está haciendo un registro dentro del programa, puede incluir una determinada palabra clave única y filtrar según esa palabra.

bjpcomet
fuente
2

Pruebe: Ventana -> Preferencias -> Android -> LogCat. Cambie el campo "Mostrar vista logcat si ..." el valor "VERBOSE". Me ayudó.

Siruk Viktor
fuente
2

Si está utilizando Eclipse , presione el signo verde + en la ventana de logCat a continuación y coloque el nombre del paquete (com.example.yourappname) en el cuadro Nombre de la aplicación . Además, elija cualquier nombre que le resulte cómodo en el cuadro Nombre del filtro y haga clic en Aceptar. Solo verá mensajes relacionados con su aplicación cuando el filtro que acaba de agregar se elija desde el panel izquierdo en logCat.

Khaled Alanezi
fuente
2

Dale un nombre a tu registro. Yo llamé al mío "wawa".

ingrese la descripción de la imagen aquí

En Android Studio, vaya a Android-> Editar configuraciones de filtro

ingrese la descripción de la imagen aquí

Luego escriba el nombre que le dio a los registros. En mi caso, se llama "wawa". Estos son algunos ejemplos de los tipos de filtros que puede hacer. Puede filtrar por System.out, System.err, Logs o nombres de paquetes:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Gene
fuente
2

Esta es probablemente la solución más simple.

Además de una solución de Tom Mulcahy, puede simplificarla aún más a continuación:

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

El uso es fácil como un alias normal. Simplemente escriba el comando en su shell:

logcat

La configuración de alias lo hace útil. Y la expresión regular lo hace robusto para aplicaciones multiproceso, suponiendo que solo se preocupe por el proceso principal.

Por supuesto, puede establecer más alias para cada proceso como desee. O use la solución de hegazy. :)

Además, si desea establecer niveles de registro, es

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

En Windows 10, usando Ionic, lo que funcionó muy bien para mí fue combinar 'findtr' con "INFO: CONSOLE" generado por todos los mensajes de la aplicación. Entonces, mi comando en la línea de comando es:

adb logcat | findstr INFO:CONSOLE
Lud Akell
fuente
1

Traté de usar la respuesta de Tom Mulcahy, pero desafortunadamente no funcionaba para aplicaciones con múltiples procesos, así que la edité para satisfacer mis necesidades.

#!/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"
Ahmed Hegazy
fuente
1

Uso -s!

Debe usar su propia etiqueta, consulte: http://developer.android.com/reference/android/util/Log.html

Me gusta.

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

Y luego, cuando quieras leer el registro, usa>

adb logcat -s AlexeysActivity

Eso filtra todo lo que no usa la misma etiqueta.

Fuente

KrisWebDev
fuente
1
No asumas que estás escribiendo el código. Puede interesarle los mensajes de las bibliotecas y no puede cambiar las cadenas de registro.
James Moore
1

Además de la respuesta de Tom Mulcahy , si desea filtrar por PID en la consola de Windows, puede crear un pequeño archivo por lotes como ese:

@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%
Lawyno
fuente
1

Obviamente, esta es una pregunta dirigida al uso de Logcat desde fuera del dispositivo desarrollador, sin embargo, si desea mostrar la salida de Logcat en el dispositivo (mediante programación), solo necesita esto:

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

los *:D final, se filtran todos los mensajes por debajo del nivel de registro de depuración, pero puede omitirlo.

Para dirigir la salida a, por ejemplo, un TextView, consulte, por ejemplo, aquí .

Tom Ladek
fuente
0

Ahora es posible escribir tag: nameofthetag o app: nameoftheapp para filtrar sin agregar nuevos filtros a la barra de filtros guardados

Fernando Gallego
fuente
0

En intelliJ (y probablemente también en eclipse) puede filtrar la salida de logcat por vista web de texto , por lo que imprime básicamente todo lo que produce phonegap

Marcin Mikołajczyk
fuente
0

Otra variante de Gavriel's applog.shcon soporte de varios dispositivos y aplicaciones con múltiples procesos:

#!/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}"

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

ls.illarionov
fuente
-1

En Linux, esto funcionó para mí:

adb logcat | grep `adb shell ps | grep your.package | awk '{print $2}'`
espectrales
fuente