Logcat to narzędzie wiersza poleceń, które zapisuje dziennik komunikatów systemowych, w tym wiadomości napisanych z aplikacji przy użyciu klasy Log
.
Ta strona dotyczy narzędzia logcat
w wierszu poleceń, ale komunikaty logu możesz też wyświetlić w oknie Logcat w Android Studio. Informacje o wyświetlaniu i filtrowaniu logów z Android Studio znajdziesz w artykule Wyświetlanie i zapisywanie logów w usłudze Logcat.
Omówienie systemu logowania
System logowania w Androidzie to zestaw uporządkowanych buforów kołowych utrzymywanych przez proces systemowy logd
. Zbiór dostępnych buforów jest stały i zdefiniowany przez system. Najbardziej odpowiednie bufory to:
main
: przechowuje większość logów aplikacji.system
: zapisuje wiadomości pochodzące z systemu operacyjnego Android.-
crash
: przechowuje dzienniki awarii. Każdy wpis logu ma priorytet, tag określający pochodzenie logu oraz rzeczywisty komunikat logu.
Podstawowym interfejsem C/C++ systemu logowania jest biblioteka współdzielona liblog
i jej nagłówek <android/log.h>
.
Wszystkie obiekty logowania w danym języku (w tym android.util.Log
) ostatecznie wywołują funkcję __android_log_write
. Domyślnie wywołuje funkcję __android_log_logd_logger
, która wysyła wpis logu do logd
za pomocą gniazda. Od poziomu interfejsu API 30 funkcję logowania można zmienić, wywołując __android_set_log_writer
. Więcej informacji znajdziesz w dokumentacji NDK.
Logi wyświetlane przez adb logcat
są poddawane 4 poziomom filtrowania:
- Filtrowanie w czasie kompilacji
- W zależności od ustawień kompilacji niektóre logi mogą zostać całkowicie usunięte z pliku binarnego. ProGuard można na przykład skonfigurować tak, aby usuwał wywołania
Log.d
z kodu Java. - Filtrowanie właściwości systemu
liblog
wysyła zapytanie do zestawu właściwości systemu, aby określić minimalny poziom ważności, który ma zostać wysłany do instancjilogd
. Jeśli Twoje logi zawierają tagMyApp
, sprawdzane są poniższe właściwości i powinny zawierać pierwszą literę o minimalnej wadze (V
,D
,I
,W
,E
lubS
, aby wyłączyć wszystkie logi):log.tag.MyApp
persist.log.tag.MyApp
log.tag
persist.log.tag
- Filtrowanie aplikacji
- Jeśli nie ustawisz żadnej właściwości,
liblog
używa minimalnego priorytetu skonfigurowanego przez__android_log_set_minimum_priority
. Ustawienie domyślne toINFO
. - Filtrowanie reklam displayowych
adb logcat
obsługuje dodatkowe filtry, które mogą zmniejszyć liczbę wyświetlanych logówlogd
. Więcej informacji znajdziesz w sekcji o filtrowaniu danych wyjściowych logu.
Składnia wiersza poleceń
Ogólnie użycie polecenia logcat
za pomocą powłoki adb
to:
[adb] shell logcat [<option>] ... [<filter-spec>] ...
Dostępny jest też skrót typu adb logcat
, który rozwija się do adb shell logcat
.
Opcje
logcat
ma wiele opcji. Dostępne opcje zależą od wersji systemu operacyjnego urządzenia. Aby wyświetlić pomoc dotyczącą logcat
dla konkretnego urządzenia, którego używasz, wykonaj:
adb logcat --help
Pamiętaj, że logcat
to narzędzie przeznaczone zarówno dla deweloperów systemów operacyjnych, jak i deweloperów aplikacji (deweloperzy aplikacji zamiast nich powinni używać Android Studio), dlatego wiele z tych opcji można używać tylko jako root
.
Filtruj dane wyjściowe logu
Tag komunikatu logu to krótki ciąg znaków wskazujący komponent systemu, z którego pochodzi komunikat. Na przykład „Widok” w przypadku systemu widoków.
Priorytet może mieć jedną z tych wartości znaków uszeregowanych od najniższego do najwyższego priorytetu:
V
: szczegółowy (najniższy priorytet)D
: debugowanieI
: informacjeW
: ostrzeżenieE
: błądF
: krytycznyS
: cichy (najwyższy priorytet, w którym nic nie jest drukowane)
Aby uzyskać listę tagów używanych w systemie z priorytetami, uruchom polecenie logcat
i zwróć uwagę na 2 pierwsze kolumny każdej wiadomości, podane jako <priority>/<tag>
.
Poniżej znajdziesz przykład krótkich danych wyjściowych logcat
uzyskanych za pomocą polecenia logcat -v brief output
. Dane wyjściowe wskazują, że komunikat odnosi się do poziomu priorytetu „I” i tagu „ActivityManager”:
I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}
Aby zmniejszyć ilość danych wyjściowych logu do zarządzania, ogranicz dane wyjściowe za pomocą wyrażeń filtra. Wyrażenia filtra umożliwiają wskazywanie systemowi kombinacji priorytetu tagu, które Cię interesują. System pomija inne wiadomości w określonych tagach.
Wyrażenie filtra jest zgodne z formatem tag:priority ...
, gdzie tag
oznacza tag, który interesuje użytkownika, a priority
wskazuje minimalny poziom priorytetu tego tagu w raportach. W logu zapisywane są komunikaty dla tego tagu o priorytecie wyższym lub wyższym. Podaj dowolną liczbę specyfikacji tag:priority
w jednym wyrażeniu filtra. Seria specyfikacji jest rozdzielana odstępami.
Poniżej znajdziesz przykład wyrażenia filtra, które pomija wszystkie komunikaty logu oprócz tych z tagiem „ActivityManager” o priorytecie „Info” lub wyższym i tych z tagiem „MojaAplikacja” o priorytecie „Debug” lub wyższym:
adb logcat ActivityManager:I MyApp:D *:S
Ostatni element poprzedniego wyrażenia (*:S
) ustawia poziom priorytetu wszystkich tagów na „silent”, dzięki czemu wyświetlane są tylko komunikaty z wartościami „ActivityManager” i „MojaAplikacja”. Użycie właściwości *:S
gwarantuje, że dane wyjściowe logów będą ograniczone do określonych przez Ciebie filtrów. *:S
umożliwia filtrom używanie ich jako listy dozwolonych dla danych wyjściowych logów.
Uwaga: w niektórych powłokach znak „*
” jest zarezerwowany przez powłokę. Jeśli używasz takiej powłoki, ujmij wyrażenie filtra w cudzysłów: adb logcat
"ActivityManager:I MyApp:D *:S"
To wyrażenie filtra wyświetla wszystkie komunikaty logu z priorytetem „warning” (ostrzeżenie) i wyższym we wszystkich tagach:
adb logcat *:W
Jeśli używasz logcat
na komputerze programistycznym, a nie w zdalnej adb
powłoce, możesz też ustawić domyślne wyrażenie filtra, eksportując wartość zmiennej środowiskowej ANDROID_LOG_TAGS
:
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
Filtr ANDROID_LOG_TAGS
nie jest eksportowany do emulatora/instancji urządzenia, jeśli używasz narzędzia logcat
ze zdalnej powłoki lub z użyciem adb shell
logcat
.
Format wyjściowy logu kontrolnego
Komunikaty logu oprócz tagu i priorytetu zawierają różne pola metadanych. Możesz zmienić format wyjściowy wiadomości, aby wyświetlały określone pole metadanych. Aby to zrobić, użyj opcji -v
i określ jeden z tych obsługiwanych formatów wyjściowych:
brief
: wyświetla priorytet, tag i identyfikator PID procesu wysyłania wiadomości.long
: wyświetla wszystkie pola metadanych i rozdziela wiadomości pustymi wierszami.process
: wyświetla tylko PID.raw
: wyświetla nieprzetworzony komunikat logu bez innych pól metadanych.tag
: wyświetla tylko priorytet i tag.thread:
Starszy format, który pokazuje priorytet, PID i TID wątku, z którego pochodzi wiadomość.threadtime
(domyślnie): wyświetla datę, czas wywołania, priorytet, tag, identyfikator PID i TID wątku wysyłającego wiadomość.time
: wyświetla datę, czas wywołania, priorytet, tag i identyfikator PID procesu wysyłania wiadomości.
Uruchamiając logcat
, określ format wyjściowy za pomocą opcji -v
:
[adb] logcat [-v <format>]
Oto przykład, który pokazuje, jak generować wiadomości w formacie wyjściowym thread
:
adb logcat -v thread
Za pomocą opcji -v
możesz określić tylko 1 format wyjściowy. Możesz jednak określić dowolną liczbę modyfikatorów, o ile mają sens. logcat
ignoruje modyfikatory, które nie mają sensu.
Modyfikatory formatu
Modyfikatory formatu zmieniają dane wyjściowe funkcji logcat
. Aby określić modyfikator formatu, użyj opcji -v
w ten sposób:
adb logcat -b all -v color -d
Z każdą wiadomością z dziennika Androida powiązany jest tag i priorytet. Możesz połączyć dowolny modyfikator formatu z jedną z tych opcji formatowania:
brief
long
process
raw
tag
thread
threadtime
time
Aby sformatować następujące szczegóły modyfikatora, wpisz logcat -v --help
w wierszu poleceń:
color
: każdy poziom priorytetu ma inny kolor.descriptive
: pokazuje opisy zdarzeń bufora dziennika. Ten modyfikator wpływa tylko na komunikaty bufora dziennika zdarzeń i nie ma wpływu na inne niebinarne bufory. Opisy zdarzeń pochodzą z bazy danych tagów logów zdarzeń.epoch
: wyświetla czas w sekundach od 1 stycznia 1970 r.monotonic
: wyświetla czas w sekundach procesora od ostatniego uruchomienia.printable
: dba o zmianę znaczenia wszystkich treści w logach binarnych.uid
: jeśli kontrola dostępu zezwala na to, wyświetla identyfikator UID lub identyfikator Androida zalogowanego procesu.usec
: wyświetla godzinę z dokładnością w mikrosekundach.UTC
: wyświetla godzinę w formacie UTC.year
: dodaje rok do wyświetlanego czasu.zone
: dodaje lokalną strefę czasową do wyświetlanego czasu.
Wyświetl alternatywne bufory logów
System logowania w Androidzie przechowuje wiele okrągłych buforów komunikatów logu i nie wszystkie komunikaty są wysyłane do domyślnego okrągłego bufora. Aby wyświetlić dodatkowe komunikaty logu, uruchom polecenie logcat
z opcją -b
, aby zażądać wyświetlenia alternatywnego bufora kołowego. Możesz wyświetlić te alternatywne bufory:
radio
: wyświetla bufor zawierający wiadomości związane z łącznością radiową lub telefoniczną.events
: wyświetla zinterpretowane komunikaty bufora zdarzeń systemu binarnego.main
: wyświetla główny bufor dziennika (domyślnie), który nie zawiera komunikatów systemowych i dzienników awarii.system
: wyświetla bufor dziennika systemowego (domyślnie).crash
: wyświetla bufor dziennika awarii (domyślnie).all
: wyświetla wszystkie bufory.default
: raportujemain
,system
icrash
buforów.
Użycie opcji -b
:
[adb] logcat [-b <buffer>]
Oto przykład, jak wyświetlić bufor dziennika zawierający wiadomości z radiem i telefonami:
adb logcat -b radio
Aby określić wiele flag -b
dla wszystkich buforów, które chcesz wydrukować, wpisz:
logcat -b main -b radio -b events
Określ pojedynczą flagę -b
z listą buforów rozdzielonych przecinkami, na przykład:
logcat -b main,radio,events
Zapisz z kodu
Klasa Log
umożliwia tworzenie w kodzie wpisów logu, które są wyświetlane w narzędziu logcat
. Typowe metody logowania to:
Log.v(String, String)
(wyczerpująco)Log.d(String, String)
(debugowanie)Log.i(String, String)
(informacja)Log.w(String, String)
(ostrzeżenie)Log.e(String, String)
(błąd)
Na przykład użycie tego wywołania:
Kotlin
Log.i("MyActivity", "MyClass.getView() — get item number $position")
Java
Log.i("MyActivity", "MyClass.getView() — get item number " + position);
logcat
zwraca wynik podobny do tego:
I/MyActivity( 1557): MyClass.getView() — get item number 1