Filtrować LogCat, aby uzyskać tylko wiadomości z Mojej aplikacji na Androida?

341

Zauważyłem, że kiedy używam Logcat z Eclipse z ADT na Androida, otrzymuję również wiadomości z wielu innych aplikacji. Czy istnieje sposób na filtrowanie tego i wyświetlanie tylko wiadomości z mojej własnej aplikacji.

Vinod
źródło
1
Wszystkie odpowiedzi sugerują filtrowanie wiadomości z debugowanej aplikacji. Nawet przy włączonych filtrach spam Logcat z innych aplikacji wkrótce wypełnia bufor dziennika, bez względu na to, jak duży jest. Czy istnieje sposób, aby powiedzieć Eclipse, aby w ogóle nie zbierała tych wiadomości lub okresowo je usuwała?
Cena

Odpowiedzi:

267

Gwarantujemy, że nazwy pakietów są unikalne, więc można użyć Logfunkcji z tagiem jako nazwą pakietu, a następnie filtrować według nazwy pakietu :

UWAGA: Od wersji Build Tools 21.0.3 nie będzie to już działać, ponieważ TAGI są ograniczone do 23 znaków lub mniej.

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

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

-doznacza rzeczywiste urządzenie i -eoznacza emulator. Jeśli działa więcej niż jeden emulator, możesz użyć -s emulator-<emulator number>(np. -s emulator-5558)

Przykład: adb -d logcat com.example.example:I *:S

Lub jeśli używasz System.out.printdo wysyłania wiadomości do dziennika, możesz użyć adb -d logcat System.out:I *:Sdo wyświetlenia tylko połączeń z System.out.

Możesz znaleźć wszystkie poziomy dziennika i więcej informacji tutaj: https://developer.android.com/studio/command-line/logcat.html

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

EDYCJA: Wygląda na to, że lekko podskoczyłem z pistoletu i właśnie zdałem sobie sprawę, że pytasz o logcat w Eclipse. To, co napisałem powyżej, dotyczy używania logcata przez adb z wiersza poleceń. Nie jestem pewien, czy te same filtry przenoszą się do Eclipse.

shanet
źródło
10
Wiem, że pytanie dotyczyło zaćmienia, ale jestem zakochany w wierszu poleceń i zawsze używam go do logcata. Użyj też narzędzi do kolorowania wyników, takich jak jsharkey.org/blog/2009/04/22/…, dzięki czemu jest nawet przydatny
Francisco Jordano
1
Testowanie na emulatorze: utknął mi podczas uruchamiania adb -e logcat com.example.example: I *: S, adb -d logcat System.out: I *: S działa.
CoDe,
1
@Shubh Co masz na myśli, że utknął? Napisałem to prawie rok temu, więc coś w Logcat mogło się od tego czasu zmienić.
shanet
58
Ta metoda filtruje według znaczników, a nie według aplikacji. Metoda Toma filtruje według aplikacji
Jonas Alves
17
Użycie logcat <your package name>:<log level>odpowiedzi sugeruje, że można użyć nazwy pakietu jako prawidłowego filtra. Musiałem przeczytać odpowiedź dwa razy, aby zrozumieć, co ona właściwie mówi, dlatego polecam po prostu zmienić pierwszy wiersz na coś w rodzaju „ logcat <tag>:<log level>gdzie <tag>może być nazwa twojego pakietu, jeśli użyłeś go również jako tagu android.util.Log
Flow
368

Linux i OS X

Użyj ps / grep / cut, aby pobrać PID, a następnie grep dla wpisów logcat z tym PID. Oto polecenie, którego używam:

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

(Możesz ulepszyć wyrażenie regularne, aby uniknąć teoretycznego problemu niepowiązanych linii logów zawierających ten sam numer, ale nigdy nie było to dla mnie problemem)

Działa to również podczas dopasowywania wielu procesów.

Windows

W systemie Windows możesz wykonać:

adb logcat | findstr com.example.package
Tom Mulcahy
źródło
2
@BTRNaidu: Możesz zainstalować Cygwin lub użyć git-bash (bash dla Windows)
Phillip
1
pid=$(adb shell ps | grep "package-name" | cut -c10-15) && adb logcat | grep $pid
VishalKale,
1
czasami gc drukuje ten sam numer z numerem pid procesu, gdy wolna pamięć. oto kolejna wersjaadb logcat | grep `adb shell ps | grep org.videolan.vlc | awk '{print $2")"}'`
alijandro
14
W systemie Windows możesz wykonać:adb logcat | findstr com.example.package
jj_
8
Drobna zmiana twojej odpowiedzi. Sugerowałbym:adb logcat | grep `adb shell ps | grep com.example.package | tr -s [:space:] ' ' | cut -d' ' -f2`
hiepnd
59

Od Androida 7.0 logcat ma opcję --pid filter, a dostępna jest komenda pidof, zamień com.example.app na nazwę pakietu.
(terminal Ubuntu / od Androida 7.0)

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

lub

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

Aby uzyskać więcej informacji o poleceniu pidof:
https://stackoverflow.com/a/15622698/7651532

Ty Kim
źródło
2
Próbowałem wszystkich opcji grepi findstr, ale filtrują one tylko dzienniki z pewną wartością, z wyłączeniem wielu wiadomości. Twoja odpowiedź jest prawdziwa, pokaż wszystkie dzienniki dotyczące aplikacji bez wykluczania wiadomości dziennika z innych bibliotek. To tak, jakby obecny filtr „Pokaż tylko wybrane” w Android Studio. Dzięki!
equiman
Te 2 polecenia działają, dopóki działa proces „com.example.app”. Jednak komunikaty o błędach pojawią się, jeśli proces nie zostanie uruchomiony. Tylko uwaga, aby uniknąć niespodzianek.
jonathanzh
53

Dodaj filtr

Dodaj filtr

Podaj nazwy

wprowadź opis zdjęcia tutaj

Wybierz swój filtr.

wprowadź opis zdjęcia tutaj

beryl
źródło
3
Podczas projektowania narzędzi programistycznych bardzo ważna jest precyzja, ponieważ od użytkownika oczekuje się precyzji. To nazwa pakietu, a nie nazwa aplikacji. > :(
Henrik Erlandsson
19

Dla mnie to działa w Terminal
systemie mac. Dotarłem do folderu, w którym adbnastępnie wpisz poniżej polecenie w terminalu

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

Tutaj filtruje wszystkie logi MyTAGiAndroidRuntime

Inder Kumar Rathore
źródło
2
1) Kod Java: Log.d("MyTAG", "i am hero"); Log.d("AndroidRunTime", "i am zero");2) DEBUGUJ logowanie do Androida $ adb -s RKSCWSOV5SAIEUSC shell;3) $ logcat MyTAG:V AndroidRuntime:E *:S 4) teraz pokaże pełny MyTAG i błędy AndroidRuntime
1
To jedyna odpowiedź, która działała dla mnie na MacOS. Dobra robota.
om-ha
1
@ om-ha dzięki, już dawno korzystałem ze Studio i nie wiedziałem, że nadal występuje problem
Inder Kumar Rathore
1
W rzeczywistości nie używam Android Studio. Używam Flutter, Android SDK i Gradle. Jako redaktor VS Code. Jest to więc świetny sposób, aby dowiedzieć się, co się dzieje w moim telefonie z
Androidem
13

Aktualizacja 17 maja

Minęło kilka lat i wszystko się zmieniło. Eclipse nie jest już oficjalnie wspierany. Oto dwa kolejne aktualne podejścia:

1. Android Studio

wprowadź opis zdjęcia tutaj W Android monitorprzyborniku możesz filtrować logcat według debuggable process. Zwykle po opracowaniu aplikacji jest to proces do debugowania. Co jakiś czas mam problemy z tym i wykonaj następujące czynności:

  1. Tools-> Android-> Enable ADB Integration.
    Jeśli było już włączone, wyłącz je, a następnie włącz ponownie

  2. Odłącz i ponownie podłącz urządzenie mobilne.

Istnieją również opcje filtrowania według wyrażenia regularnego i poziomu debugowania

2. kolor logcat

Jest to ładne opakowanie Pythona, adb logcatjeśli chcesz użyć rozwiązania opartego na terminalu. Dobrą rzeczą jest to, że można zapisać wiele konfiguracji i po prostu ich ponownie użyć. Filtrowanie wedługtags jest dość niezawodne. Możesz również filtrować według, packageaby zobaczyć dzienniki tylko jednej lub więcej aplikacji, ale zaczynasz logcat-colorbezpośrednio przed uruchomieniem aplikacji.

Stara odpowiedź:

Wygląda na to, że nie mogę komentować poprzednich odpowiedzi, więc opublikuję nową. To jest komentarz do odpowiedzi Toma Mulcahy , który pokazuje, jak polecenie powinno się zmienić, aby działało na większości urządzeń, ponieważadb shell ps kolumna PID jest zmienna.

UWAGA: Poniższe polecenie działa w przypadkach, w których podłączono wiele urządzeń. Więc device idjest potrzebne. W przeciwnym razie możesz po prostu pominąć nawiasy kwadratowe „[”, „]”

1. Aby znaleźć kolumnę pid, wpisz:

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

Teraz zapamiętaj numer kolumny dla PID. Numeracja zaczyna się od 1.

2. Następnie wpisz następujące polecenie:

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

Po prostu wstaw kolumnę, którą zapamiętałeś PUT_COLUMN_HERE, np$5

Zastrzeżenie

Za każdym razem, gdy ponownie uruchamiasz aplikację, musisz ponownie uruchomić drugie polecenie, ponieważ aplikacja otrzymuje nowy PID z systemu operacyjnego.

Paschalis
źródło
Spójrz na te wszystkie rzeczy, które musisz zrobić, aby uzyskać dzienniki aplikacji, a nie innych aplikacji. Poza tym uważam, że to śmieszne, że inni ludzie widzą dzienniki innych ludzi. Mówisz mi, że Google nic nie może na to poradzić? Tylko upewnij się, że moje logi nie są widoczne dla innych osób i utrzymuj mojego logcat w czystości?
TatiOverflow
10

Działa to dla mnie w git bash:

$ pid=$(adb shell ps | grep <package name> | cut -c11-15) ; adb logcat | grep $pid
wubwubb
źródło
9

umieść to na 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}:"

następnie: applog.sh com.example.my.package

Gavriel
źródło
Oto odmiana filtra do przechwytywania dzienników wielowierszowych (jeśli zrobiłeś to log.d("TAG", "multine\nlog")na przykład): adb -d logcat -v long | sed -Ene '/^\[.*'" (${APPID}):"'.*\]/ { N; s/\n/ /; p; :a;' -e 'n; p; s/^.+$/foo/; t a;' -e ' }' | grep -v '^$'- Pominąłem, zakładam tr, że jest to potrzebne w systemach Windows, i owinąłem APPIDnawiasy, aby umożliwić wiele pid (oddzielone przez |) .
Logan Pickup
9

Działa to dla mnie z debugowaniem USB:

  1. Podłącz urządzenie i użyj:

    adb shell

  2. Użyj logcat po podłączeniu:

    logcat | grep com.yourapp.packagename

Lennoard Silva
źródło
7

Jeśli korzystasz z Android Studio , możesz wybrać proces, z którego chcesz otrzymywać logcaty. Oto zrzut ekranu.

wprowadź opis zdjęcia tutaj

dmSherazi
źródło
1
od wersji Android Studio 0.4.5 otrzymasz wiadomości z aplikacji, która jest uruchomiona. 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

Napisałem skrypt powłoki do filtrowania logcat według nazwy pakietu, który moim zdaniem jest bardziej niezawodny niż używanie

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

Używa / proc / $ pid / cmdline, aby znaleźć rzeczywisty pid, a następnie wykonać grep na logcat

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

Kevin
źródło
7

Ubuntu: adb logcat -b all -v color --pid = `adb shell pidof -s com.packagename` Z kolorem i ciągłym logiem aplikacji

Sandeep PC
źródło
adb shell pidof ...Bit nie działa dla mnie, więc adb shelled do urządzenia i pobiegł topkopiowane PID dla mojego app tam i wtedy wymienić go w swoim poleceń
edzillion
spróbuj pgrepzamiast
pidof
Działa to dla mnie na OSX, dodatkowe punkty za kolor -v
Mars
6

ADT v15 dla Eclipse pozwala określić nazwę aplikacji (która jest faktycznie wartością pakietu w pliku androidmanifest.xml).

Uwielbiam móc filtrować według aplikacji, ale nowy logcat ma błąd w autoprzewijaniu. Gdy przewiniesz trochę w górę, aby zobaczyć poprzednie dzienniki, automatycznie przewinie się z powrotem na dół w ciągu kilku sekund. Wygląda na to, że przewijanie 1/2 w górę dziennika nie pozwala mu przeskoczyć z powrotem na dół, ale często jest to bezużyteczne.

EDYCJA: Próbowałem określić filtr aplikacji z wiersza poleceń - ale bez powodzenia. Jeśli ktoś to wymyśli LUB LUB, jak zatrzymać automatyczne przewijanie, daj mi znać.

Aaron T. Harris
źródło
6

Za pomocą wiersza polecenia systemu Windows: adb logcat -d | findstr <package> .

* Po raz pierwszy wspomniał o tym jj_ , ale zajęło mi wieki znalezienie go w komentarzach ...

rzadka klasa
źródło
4

Jako wariant możesz użyć zewnętrznego skryptu PID Cat autorstwa Jake'a Whartona. Ten skrypt ma dwie główne zalety:

  • wyświetla wpisy dziennika dla procesów z określonego pakietu aplikacji
  • kolor logcat

Z dokumentacji:

Podczas tworzenia aplikacji często chcesz wyświetlać tylko komunikaty dziennika pochodzące z aplikacji. Niestety, ponieważ identyfikator procesu zmienia się za każdym razem, gdy wdrażasz telefon, wyzwaniem jest szukanie właściwego rozwiązania.

Ten skrypt rozwiązuje ten problem, filtrując według pakietu aplikacji.

Wygląda jak wprowadź opis zdjęcia tutaj

yoAlex5
źródło
2

Nie jestem pewien, czy istnieje sposób, aby wyświetlać tylko komunikaty systemowe dotyczące Twojej aplikacji, ale możesz filtrować na podstawie ciągu. Jeśli robisz dziennik w programie, możesz po prostu dołączyć określone unikalne słowo kluczowe i filtrować na podstawie tego słowa.

bjpcomet
źródło
2

Wypróbuj: Okno -> Preferencje -> Android -> LogCat. Zmień pole „Pokaż widok logcat, jeśli ...” wartość „VERBOSE”. Pomogło mi to.

Siruk Viktor
źródło
2

Jeśli używasz Eclipse , naciśnij zielony + znak w oknie logCat poniżej i wpisz nazwę pakietu (com.example.yourappname) w polu Nazwa aplikacji . Wybierz dowolną wygodną nazwę w polu Nazwa filtru i kliknij OK. Zobaczysz tylko wiadomości związane z aplikacją, gdy właśnie dodany filtr zostanie wybrany z lewego panelu w logCat.

Khaled Alanezi
źródło
2

Nadaj dziennikowi nazwę. Nazwałem mój „wawa”.

wprowadź opis zdjęcia tutaj

W Android Studio przejdź do Android-> Edytuj konfiguracje filtrów

wprowadź opis zdjęcia tutaj

Następnie wpisz nazwę, którą nadałeś dziennikom. W moim przypadku nazywa się to „wawa”. Oto kilka przykładów rodzajów filtrów, które możesz zrobić. Możesz filtrować według System.out, System.err, Logs lub nazw pakietów:

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Gen
źródło
2

Jest to prawdopodobnie najprostsze rozwiązanie.

Oprócz rozwiązania od Toma Mulcahy, możesz dodatkowo uprościć to, jak poniżej:

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

Użycie jest proste jak zwykły alias. Po prostu wpisz polecenie w swojej powłoce:

logcat

Konfiguracja aliasu sprawia, że ​​jest to przydatne. Wyrażenie regularne sprawia, że ​​jest on odporny na aplikacje wieloprocesowe, zakładając, że dbasz tylko o główny proces.

Ponieważ możesz ustawić więcej aliasów dla każdego procesu, jak chcesz. Lub skorzystaj z rozwiązania hegazy'ego. :)

Ponadto, jeśli chcesz ustawić poziomy rejestrowania, jest to możliwe

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

W systemie Windows 10, używając Ionic, działało mi świetnie, łącząc „findstr” z „INFO: CONSOLE” generowanym przez wszystkie komunikaty aplikacji. Zatem moje polecenie w wierszu polecenia to:

adb logcat | findstr INFO:CONSOLE
Lud Akell
źródło
1

Próbowałem użyć odpowiedzi Toma Mulcahy, ale niestety nie działała ona w aplikacjach z wieloma procesami, więc edytuję ją zgodnie z moimi potrzebami.

#!/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
źródło
1

Użyj -s!

Powinieneś użyć własnego tagu, patrz: http://developer.android.com/reference/android/util/Log.html

Lubić.

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

A potem, gdy chcesz przeczytać dziennik, użyj>

adb logcat -s AlexeysActivity

To odfiltrowuje wszystko, co nie używa tego samego tagu.

Źródło

KrisWebDev
źródło
1
Nie zakładaj, że piszesz kod. Możesz dbać o wiadomości z bibliotek i nie możesz zmieniać ciągów dziennika.
James Moore
1

Oprócz odpowiedzi Toma Mulcahy , jeśli chcesz filtrować według PID na konsoli Windows, możesz utworzyć mały plik wsadowy w ten sposób:

@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
źródło
1

Jest to oczywiście pytanie mające na celu użycie Logcat spoza urządzenia programisty, jednak jeśli chcesz wyświetlić dane wyjściowe Logcat na urządzeniu (programowo), potrzebujesz tego:

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

The *:D końcu filtruje każdą wiadomość poniżej poziomu dziennika debugowania, ale możesz to pominąć.

Aby skierować wyjście do, powiedzmy, TextView, zobacz na przykład tutaj .

Tomek Ladek
źródło
0

Teraz można wpisać tag: nameofthetag lub app: nameoftheapp, aby filtrować bez dodawania nowych filtrów do paska zapisanych filtrów

Fernando Gallego
źródło
0

W intelliJ (i prawdopodobnie również w zaćmieniu) możesz filtrować dane wyjściowe logcat według tekstu webview , więc drukuje w zasadzie wszystko, co produkuje phonegap

Marcin Mikołajczyk
źródło
0

Kolejny wariant Gavriel applog.shz obsługą kilku urządzeń i aplikacji z wieloma procesami:

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

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

ls.illarionov
źródło
-1

W systemie Linux działało to dla mnie:

adb logcat | grep `adb shell ps | grep your.package | awk '{print $2}'`
spectralsun
źródło