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.
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.
Respostas:
Os nomes dos pacotes são garantidos como exclusivos, para que você possa usar a Log
funçã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
-d
indica um dispositivo real e -e
indica 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.print
envio de mensagens para o log, poderá usar adb -d logcat System.out:I *:S
apenas 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.
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
"
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.
No Windows, você pode fazer:
adb logcat | findstr com.example.package
pid=$(adb shell ps | grep "package-name" | cut -c10-15) && adb logcat | grep $pid
adb logcat | grep `adb shell ps | grep org.videolan.vlc | awk '{print $2")"}'`
adb logcat | findstr com.example.package
adb logcat | grep `adb shell ps | grep com.example.package | tr -s [:space:] ' ' | cut -d' ' -f2`
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
grep
e 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!
Adicionar filtro
Especifique nomes
Escolha o seu filtro.
Para mim isso funciona no mac Terminal
Chegou à pasta onde você adb
digitou o comando abaixo no terminal
./adb logcat MyTAG:V AndroidRuntime:E *:S
Aqui ele filtrará todos os logs de MyTAG
eAndroidRuntime
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
Faz alguns anos e as coisas mudaram. E o Eclipse não é mais suportado oficialmente. Então, aqui estão mais duas abordagens atualizadas:
Na Android monitor
caixa 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:
Tools
-> Android
-> Enable ADB Integration
.
Se já estiver ativado, desative-o e ligue-o novamente.
Desconecte e reconecte seu dispositivo móvel.
Também existem opções para filtrar via regex e o nível de depuração
Este é um bom empacotador python, adb logcat
se 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 package
para ver os logs de um ou mais aplicativos apenas, mas começa logcat-color
antes de iniciar o aplicativo.
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 ps
coluna 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
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.
Isso tem funcionado para mim no git bash:
$ pid=$(adb shell ps | grep <package name> | cut -c11-15) ; adb logcat | grep $pid
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
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
, APPID
suponho que seja necessário nos sistemas Windows e envolvi os parênteses para permitir vários pids (separados por |
) .
Isso funciona para mim com a depuração USB:
Conecte o dispositivo e use:
adb shell
Use o logcat quando conectado:
logcat | grep com.yourapp.packagename
Se você estiver usando o Android Studio, poderá selecionar o processo do qual deseja receber os logcats. Aqui está a captura de tela.
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
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
Ubuntu: adb logcat -b all -v color --pid = `adb shell pidof -s com.packagename` Com cor e registro contínuo do aplicativo
adb shell pidof ...
pouco não fez um trabalho para mim assim que eu adb shell
ed no dispositivo e correu top
copiou o PID para o meu aplicativo lá e, em seguida, substituiu-o em seu comando
pgrep
em vez de pidof
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.
Como uma variante, você pode usar o script PID Cat de Jake Wharton de terceiros . Este script tem duas vantagens principais:
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.
Tente: Janela -> Preferências -> Android -> LogCat. Altere o campo "Mostrar exibição do logcat se ..." o valor "VERBOSE". Isso me ajudou.
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.
Dê um nome ao seu log. Eu chamei o meu de "wawa".
No Android Studio, vá para Android-> Editar configurações de filtro
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:
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`"
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"
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.
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%
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 *:D
final 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 .
Agora é possível digitar tag: nameofthetag ou app: nameoftheapp para filtrar sem adicionar novos filtros à barra de filtros salvos
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
Mais uma variante do Gavriel's applog.sh
com 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>]
No linux, isso funcionou para mim:
adb logcat | grep `adb shell ps | grep your.package | awk '{print $2}'`