Filtrar o LogCat para receber apenas as mensagens de Meu aplicativo no Android?

340

Observei que quando uso o Logcat com o Eclipse com o ADT para Android, também recebo mensagens de muitos outros aplicativos. Existe uma maneira de filtrar isso e mostrar apenas mensagens do meu próprio aplicativo.

Vinod
fonte
11
Todas as respostas sugerem a filtragem de mensagens do aplicativo que está sendo depurado. Mesmo com esses filtros ativados, o spam do Logcat de outros aplicativos logo preenche o buffer de log, independentemente do tamanho. Existe uma maneira de dizer ao Eclipse para não coletar essas mensagens ou continuar excluindo-as periodicamente?
Price

Respostas:

267

Os nomes dos pacotes são garantidos como exclusivos, para que você possa usar a Logfunção com a tag como nome do pacote e, em seguida, filtrar por nome do pacote :

NOTA: A partir das Ferramentas de construção 21.0.3, isso não funcionará mais, pois os TAGS estão restritos a 23 caracteres ou menos.

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

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

-dindica um dispositivo real e -eindica um emulador. Se houver mais de um emulador em execução, você pode usar -s emulator-<emulator number>(por exemplo, -s emulator-5558)

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

Ou, se você estiver usando o System.out.printenvio de mensagens para o log, poderá usar adb -d logcat System.out:I *:Sapenas para mostrar chamadas para System.out.

Você pode encontrar todos os níveis de log e mais informações aqui: https://developer.android.com/studio/command-line/logcat.html

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

Edição: Parece que eu pulei a arma um pouco e só percebi que você estava perguntando sobre o logcat no Eclipse. O que eu postei acima é para usar o logcat através do adb na linha de comando. Não tenho certeza se os mesmos filtros são transferidos para o Eclipse.

Shanet
fonte
10
Eu sei que a pergunta era sobre eclipse, mas estou apaixonada pela linha de comando e sempre a uso também para o logcat. Também usar algumas ferramentas para colorir a saída como jsharkey.org/blog/2009/04/22/... torna ainda útil
Francisco Jordano
11
Teste no emulador: ficou preso quando executo adb -e logcat com.example.example: I *: S, adb -d logcat System.out: I *: S funcionando.
CoDe
11
@Shubh Como assim, estava preso? Eu publiquei isso há quase um ano, então algo no Logcat pode ter mudado desde então.
Shanet
58
Esse método filtra por tag, não por aplicativo. O método de Tom filtra por aplicativo
Jonas Alves
17
Ao usar logcat <your package name>:<log level>a resposta, é possível usar o nome do pacote como filtro válido. Eu precisava ler a resposta duas vezes para compreender o que realmente está dizendo; portanto, recomendo alterar a primeira linha para algo como " logcat <tag>:<log level>onde <tag>pode estar o nome do seu pacote se você também usou como tag android.util.Log"
Flow
367

Linux e OS X

Use ps / grep / cut para obter o PID e, em seguida, grep para entradas de logcat com esse PID. Aqui está o comando que eu uso:

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

(Você pode melhorar ainda mais a regex para evitar o problema teórico de linhas de log não relacionadas que contenham o mesmo número, mas isso nunca foi um problema para mim)

Isso também funciona ao combinar vários processos.

janelas

No Windows, você pode fazer:

adb logcat | findstr com.example.package
Tom Mulcahy
fonte
2
@BTRNaidu: Você pode instalar o Cygwin ou o uso git-bash (festa para Windows)
Phillip
11
pid=$(adb shell ps | grep "package-name" | cut -c10-15) && adb logcat | grep $pid
VishalKale
11
às vezes gc imprime o mesmo número com o número pid de um processo ao liberar memória. aqui está uma outra versãoadb logcat | grep `adb shell ps | grep org.videolan.vlc | awk '{print $2")"}'`
alijandro
14
No Windows, você pode:adb logcat | findstr com.example.package
jj_
8
Apenas uma pequena alteração na sua resposta. Gostaria de sugerir:adb logcat | grep `adb shell ps | grep com.example.package | tr -s [:space:] ' ' | cut -d' ' -f2`
hiepnd
59

Desde o Android 7.0, o logcat tem a opção --pid filter e o comando pidof está disponível, substitua com.example.app pelo nome do pacote.
(ubuntu terminal / Desde o Android 7.0)

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

ou

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

Para obter mais informações sobre o comando pidof:
https://stackoverflow.com/a/15622698/7651532

Você Kim
fonte
2
Eu tentei todas as opções grepe findstr, mas elas estão apenas filtrando logs com algum valor, excluindo muitas mensagens. Sua resposta é verdadeira: mostre todo o log sobre o aplicativo sem excluir a mensagem de log de outras bibliotecas. É como o filtro atual "Mostrar apenas selecionado" do Android Studio. Obrigado!
equiman
Esses 2 comandos funcionam enquanto o processo "com.example.app" estiver em execução. No entanto, as mensagens de erro serão exibidas se o processo não estiver em execução. Apenas uma nota lateral para evitar surpresas.
jonathanzh
53

Adicionar filtro

Adicionar filtro

Especifique nomes

insira a descrição da imagem aqui

Escolha o seu filtro.

insira a descrição da imagem aqui

berílio
fonte
3
É muito importante ser preciso ao projetar ferramentas de desenvolvimento, pois é esperado que o usuário seja preciso. Esse é o nome do pacote, não o nome do aplicativo. > :(
Henrik Erlandsson
19

Para mim isso funciona no mac Terminal
Chegou à pasta onde você adbdigitou o comando abaixo no terminal

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

Aqui ele filtrará todos os logs de MyTAGeAndroidRuntime

Inder Kumar Rathore
fonte
2
1) código Java: Log.d("MyTAG", "i am hero"); Log.d("AndroidRunTime", "i am zero");2) para o login DEBUG para Android $ adb -s RKSCWSOV5SAIEUSC shell;3) $ logcat MyTAG:V AndroidRuntime:E *:S 4) agora ele vai mostrar detalhado de MyTag e erros de AndroidRuntime
11
Esta é a única resposta que funcionou para mim no MacOS. Bom trabalho.
om-ha
11
@ om-ha obrigado, eu usei o Studio há muito tempo e não sabia que ainda havia o problema
Inder Kumar Rathore 10/01
11
Na verdade, não estou usando o Android Studio. Estou usando Flutter, Android SDK e Gradle. Como editor, o VS Code. Portanto, esta é uma excelente maneira de saber o que está acontecendo no meu telefone Android
om-ha
13

Atualização 17 de maio

Faz alguns anos e as coisas mudaram. E o Eclipse não é mais suportado oficialmente. Então, aqui estão mais duas abordagens atualizadas:

1. Android Studio

insira a descrição da imagem aqui Na Android monitorcaixa de ferramentas, você pode filtrar por logcat por debuggable process. Normalmente, quando você desenvolve um aplicativo, é um processo depurável. De vez em quando, tenho problemas com isso e faço o seguinte:

  1. Tools-> Android-> Enable ADB Integration.
    Se já estiver ativado, desative-o e ligue-o novamente.

  2. Desconecte e reconecte seu dispositivo móvel.

Também existem opções para filtrar via regex e o nível de depuração

2. logcat-color

Este é um bom empacotador python, adb logcatse você quiser usar uma solução baseada em terminal. O bom disso é que você pode salvar várias configurações e simplesmente reutilizá-las. A filtragem por tagsé bastante confiável. Você também pode filtrar packagepara ver os logs de um ou mais aplicativos apenas, mas começa logcat-colorantes de iniciar o aplicativo.

Resposta antiga:

Parece que não posso comentar as respostas anteriores, por isso postarei uma nova. Este é um comentário à resposta de Tom Mulcahy , que mostra como o comando deve mudar para funcionar na maioria dos dispositivos, pois a adb shell pscoluna PID é variável.

NOTA: O comando abaixo funciona para os casos em que você conectou muitos dispositivos. Então device idé necessário. Caso contrário, você pode simplesmente omitir os colchetes '[', ']'

1. Para descobrir a coluna pid, digite:

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

Agora memorize o número da coluna para o PID. A numeração começa em 1.

2. Em seguida, digite o seguinte:

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

Basta colocar a coluna que você memorizou PUT_COLUMN_HERE, por exemplo$5

Embargo

Cada vez que você executa novamente o aplicativo, é necessário executar novamente o segundo comando, porque o aplicativo recebe um novo PID do sistema operacional.

Paschalis
fonte
Veja todas essas coisas que você precisa fazer apenas para obter logs para seu aplicativo, não para outros aplicativos. Além disso, acho realmente ridículo que outras pessoas possam ver os registros de outras pessoas. Você está me dizendo que não há nada que o Google possa fazer sobre isso? Apenas certifique-se de que meus logs não sejam vistos por outras pessoas e mantenha meu logcat limpo?
TatiOverflow 15/08/19
10

Isso tem funcionado para mim no git bash:

$ pid=$(adb shell ps | grep <package name> | cut -c11-15) ; adb logcat | grep $pid
wubwubb
fonte
é possível usá-lo no código android?
niko1312 13/03
9

coloque isso em 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}:"

então: applog.sh com.example.my.package

Gavriel
fonte
Aqui está uma variação do filtro para capturar logs de várias linhas ( se você fez log.d("TAG", "multine\nlog")por exemplo): adb -d logcat -v long | sed -Ene '/^\[.*'" (${APPID}):"'.*\]/ { N; s/\n/ /; p; :a;' -e 'n; p; s/^.+$/foo/; t a;' -e ' }' | grep -v '^$'- Deixei de fora tr, APPIDsuponho que seja necessário nos sistemas Windows e envolvi os parênteses para permitir vários pids (separados por |) .
Logan Pickup
9

Isso funciona para mim com a depuração USB:

  1. Conecte o dispositivo e use:

    adb shell

  2. Use o logcat quando conectado:

    logcat | grep com.yourapp.packagename

Lennoard Silva
fonte
7

Se você estiver usando o Android Studio, poderá selecionar o processo do qual deseja receber os logcats. Aqui está a captura de tela.

insira a descrição da imagem aqui

dmSherazi
fonte
11
a partir do android studio ver 0.4.5, você receberá mensagens do aplicativo que está sendo executado apenas. 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

Escrevi um script de shell para filtrar o logcat pelo nome do pacote, que acho mais confiável do que usar

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

Ele usa / proc / $ pid / cmdline para descobrir o pid real e depois faz um grep no logcat

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

Kevin
fonte
7

Ubuntu: adb logcat -b all -v color --pid = `adb shell pidof -s com.packagename` Com cor e registro contínuo do aplicativo

Sandeep PC
fonte
O adb shell pidof ...pouco não fez um trabalho para mim assim que eu adb shelled no dispositivo e correu topcopiou o PID para o meu aplicativo lá e, em seguida, substituiu-o em seu comando
edzillion
tente pgrepem vez de pidof
Lennoard Silva
Isso funciona para mim no OSX, pontos extras para -v color
Mars
6

O ADT v15 para Eclipse permite especificar um nome de aplicativo (que é realmente o valor do pacote no seu androidmanifest.xml).

Adoro poder filtrar por aplicativo, mas o novo logcat tem um erro com a rolagem automática. Quando você rola um pouco para cima para ver os logs anteriores, ele rola automaticamente de volta para a parte inferior em alguns segundos. Parece que rolar 1/2 caminho acima do log impede que ele volte para o fundo, mas isso geralmente é inútil.

EDIT: Tentei especificar um filtro de aplicativo na linha de comando - mas sem sorte. Se alguém descobrir isso OU como interromper a rolagem automática, entre em contato.

Aaron T Harris
fonte
6

Usando o Windows prompt de comando: adb logcat -d | findstr <package>.

* Isso foi mencionado pela primeira vez por jj_ , mas levei anos para encontrá-lo nos comentários ...

rareclass
fonte
4

Como uma variante, você pode usar o script PID Cat de Jake Wharton de terceiros . Este script tem duas vantagens principais:

  • mostra entradas de log para processos de um pacote de aplicativos específico
  • logcat de cor

Da documentação:

Durante o desenvolvimento do aplicativo, você geralmente deseja exibir apenas mensagens de log provenientes do seu aplicativo. Infelizmente, como o ID do processo muda toda vez que você implanta no telefone, torna-se um desafio esperar pela coisa certa.

Este script resolve esse problema filtrando por pacote de aplicativos.

Uma saída parece insira a descrição da imagem aqui

yoAlex5
fonte
2

Não sei se há uma maneira de ver apenas as mensagens do sistema em relação ao seu aplicativo, mas você pode filtrar com base em uma string. Se você estiver fazendo um log no programa, poderá incluir apenas uma determinada palavra-chave exclusiva e filtrar com base nessa palavra.

bjpcomet
fonte
2

Tente: Janela -> Preferências -> Android -> LogCat. Altere o campo "Mostrar exibição do logcat se ..." o valor "VERBOSE". Isso me ajudou.

Siruk Viktor
fonte
2

Se você estiver usando o Eclipse , pressione o sinal verde + na janela logCat abaixo e coloque o nome do seu pacote (com.example.yourappname) na caixa por Nome do Aplicativo . Além disso, escolha qualquer nome confortável para você na caixa Nome do filtro e clique em ok. Você verá apenas mensagens relacionadas ao seu aplicativo quando o filtro que você acabou de adicionar for escolhido no painel esquerdo do logCat.

Khaled Alanezi
fonte
2

Dê um nome ao seu log. Eu chamei o meu de "wawa".

insira a descrição da imagem aqui

No Android Studio, vá para Android-> Editar configurações de filtro

insira a descrição da imagem aqui

Em seguida, digite o nome que você deu aos logs. No meu caso, é chamado "wawa". Aqui estão alguns exemplos dos tipos de filtros que você pode fazer. Você pode filtrar por System.out, System.err, Logs ou nomes de pacotes:

insira a descrição da imagem aqui insira a descrição da imagem aqui insira a descrição da imagem aqui

Gene
fonte
2

Esta é provavelmente a solução mais simples.

Além de uma solução de Tom Mulcahy, você pode simplificá-la ainda mais, como abaixo:

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

O uso é fácil como alias normal. Basta digitar o comando no seu shell:

logcat

A configuração do alias torna isso útil. E o regex o torna robusto para aplicativos com vários processos, assumindo que você se preocupa apenas com o processo principal.

No coz, você pode definir mais aliases para cada processo como desejar. Ou use a solução de hegazy. :)

Além disso, se você deseja definir níveis de log, é

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

No Windows 10, usando o Ionic, o que funcionou muito bem foi combinar 'findstr' com o "INFO: CONSOLE" gerado por todas as mensagens do aplicativo. Então, meu comando na linha de comando é:

adb logcat | findstr INFO:CONSOLE
Lud Akell
fonte
1

Tentei usar a resposta de Tom Mulcahy, mas infelizmente não estava funcionando para aplicativos com vários processos, então editei para atender às minhas necessidades.

#!/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
fonte
1

Use -s!

Você deve usar sua própria tag, veja: http://developer.android.com/reference/android/util/Log.html

Gostar.

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

E então, quando você quiser ler o log, use>

adb logcat -s AlexeysActivity

Isso filtra tudo o que não usa a mesma tag.

Fonte

KrisWebDev
fonte
11
Não assuma que você está escrevendo o código. Você pode se importar com as mensagens das bibliotecas e não pode alterar as seqüências de log.
James Moore
1

Além da resposta de Tom Mulcahy , se você deseja filtrar por PID no console do Windows, é possível criar um pequeno arquivo em lotes como este:

@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
fonte
1

Obviamente, essa é uma pergunta voltada para o uso do Logcat de fora do dispositivo do desenvolvedor. No entanto, se você deseja exibir a saída do Logcat no dispositivo (programaticamente), basta isso:

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

O *:Dfinal filtra todas as mensagens abaixo do nível do log de depuração, mas você pode deixar isso de fora.

Para direcionar a saída para, digamos, um TextView, veja por exemplo aqui .

Tom Ladek
fonte
0

Agora é possível digitar tag: nameofthetag ou app: nameoftheapp para filtrar sem adicionar novos filtros à barra de filtros salvos

Fernando Gallego
fonte
0

No intelliJ (e provavelmente também no eclipse), você pode filtrar a saída do logcat pelo texto webview , para que ele imprima basicamente tudo o que o phonegap está produzindo

Marcin Mikołajczyk
fonte
0

Mais uma variante do Gavriel's applog.shcom suporte a vários dispositivos e aplicativos com vários processos:

#!/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
fonte
-1

No linux, isso funcionou para mim:

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