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.
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.
Odpowiedzi:
Gwarantujemy, że nazwy pakietów są unikalne, więc można użyć Log
funkcji 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
-d
oznacza rzeczywiste urządzenie i -e
oznacza 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.print
do wysyłania wiadomości do dziennika, możesz użyć adb -d logcat System.out:I *:S
do 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.
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
”
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.
W systemie Windows możesz wykonać:
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`
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
grep
i 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!
Dodaj filtr
Podaj nazwy
Wybierz swój filtr.
Dla mnie to działa w Terminal
systemie mac. Dotarłem do folderu, w którym adb
następnie wpisz poniżej polecenie w terminalu
./adb logcat MyTAG:V AndroidRuntime:E *:S
Tutaj filtruje wszystkie logi MyTAG
iAndroidRuntime
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
Minęło kilka lat i wszystko się zmieniło. Eclipse nie jest już oficjalnie wspierany. Oto dwa kolejne aktualne podejścia:
W Android monitor
przyborniku 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:
Tools
-> Android
-> Enable ADB Integration
.
Jeśli było już włączone, wyłącz je, a następnie włącz ponownie
Odłącz i ponownie podłącz urządzenie mobilne.
Istnieją również opcje filtrowania według wyrażenia regularnego i poziomu debugowania
Jest to ładne opakowanie Pythona, adb logcat
jeś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, package
aby zobaczyć dzienniki tylko jednej lub więcej aplikacji, ale zaczynasz logcat-color
bezpośrednio przed uruchomieniem aplikacji.
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 id
jest 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
Za każdym razem, gdy ponownie uruchamiasz aplikację, musisz ponownie uruchomić drugie polecenie, ponieważ aplikacja otrzymuje nowy PID z systemu operacyjnego.
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
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 APPID
nawiasy, aby umożliwić wiele pid (oddzielone przez |
) .
Działa to dla mnie z debugowaniem USB:
Podłącz urządzenie i użyj:
adb shell
Użyj logcat po podłączeniu:
logcat | grep com.yourapp.packagename
Jeśli korzystasz z Android Studio , możesz wybrać proces, z którego chcesz otrzymywać logcaty. Oto zrzut ekranu.
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
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
Ubuntu: adb logcat -b all -v color --pid = `adb shell pidof -s com.packagename` Z kolorem i ciągłym logiem aplikacji
adb shell pidof ...
Bit nie działa dla mnie, więc adb shell
ed do urządzenia i pobiegł top
kopiowane PID dla mojego app tam i wtedy wymienić go w swoim poleceń
pgrep
zamiast
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ć.
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 ...
Jako wariant możesz użyć zewnętrznego skryptu PID Cat autorstwa Jake'a Whartona. Ten skrypt ma dwie główne zalety:
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.
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.
Wypróbuj: Okno -> Preferencje -> Android -> LogCat. Zmień pole „Pokaż widok logcat, jeśli ...” wartość „VERBOSE”. Pomogło mi to.
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.
Nadaj dziennikowi nazwę. Nazwałem mój „wawa”.
W Android Studio przejdź do Android-> Edytuj konfiguracje filtrów
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:
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`"
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"
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.
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%
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 .
Teraz można wpisać tag: nameofthetag lub app: nameoftheapp, aby filtrować bez dodawania nowych filtrów do paska zapisanych filtrów
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
Kolejny wariant Gavriel applog.sh
z 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>]
W systemie Linux działało to dla mnie:
adb logcat | grep `adb shell ps | grep your.package | awk '{print $2}'`