Logcat to narzędzie wiersza poleceń, które zapisuje dziennik komunikatów systemowych:
wiadomości napisane z poziomu aplikacji wraz z
Log
zajęcia.
Ta strona dotyczy narzędzia logcat
wiersza poleceń, ale możesz też wyświetlić dziennik
z okna Logcat w Android Studio. Dla:
informacje o wyświetlaniu i filtrowaniu dzienników z Android Studio,
Więcej informacji znajdziesz w sekcji Wyświetlanie i zapis logów przy użyciu
Logcat.
Omówienie systemu logowania
System logowania w Androidzie to zbiór uporządkowanych, okrągłych buforów utrzymywanych przez system
proces logd
. Zbiór dostępnych buforów jest ustalony i zdefiniowany przez funkcję
systemu. Najważniejsze bufory:
main
: przechowuje większość logów aplikacji.system
: przechowuje wiadomości pochodzące z systemu operacyjnego Android.-
crash
: przechowuje dzienniki awarii. Każdy wpis logu ma priorytet, czyli tag, który określa źródło dziennika oraz rzeczywisty komunikat dziennika.
Podstawowym interfejsem C/C++ systemu logowania jest biblioteka współdzielona liblog
a nagłówek <android/log.h>
.
Wszystkie narzędzia logowania w różnych językach
(w tym android.util.Log
)
na koniec wywołaj funkcję
__android_log_write
Domyślnie wywołuje funkcję
__android_log_logd_logger
, który wysyła wpis logu do logd
za pomocą gniazdka elektrycznego. Począwszy od poziomu interfejsu API 30, funkcję logowania można zmienić, wywołując
__android_set_log_writer
Więcej informacji znajdziesz w
Dokumentacja NDK
Logi wyświetlane przez adb logcat
są filtrowane na 4 poziomach:
- Filtrowanie podczas kompilacji
- W zależności od ustawień kompilacji niektóre logi mogą być
usunięte z pliku binarnego. ProGuard można na przykład skonfigurować tak, aby usuwał wywołania
Log.d
w kodzie Java. - Filtrowanie właściwości systemowych
liblog
wysyła zapytanie do zestawu właściwości systemowych, aby określają minimalny poziom ważności, który należy wysłać do użytkownikalogd
. Jeśli dzienniki zawierają tagMyApp
, zostaną sprawdzone następujące właściwości i powinny zawierać pierwsza litera minimalnej wagi (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 jest ustawiona żadna z właściwości,
liblog
stosuje minimalny priorytet określony przez__android_log_set_minimum_priority
Ustawienie domyślne toINFO
- Filtrowanie wyświetlania
adb logcat
obsługuje dodatkowe filtry, które mogą ograniczyć liczbę wyświetlanych logów z okresulogd
. Zapoznaj się z sekcją na temat filtrowanie wyników dziennika, by uzyskać więcej informacji.
Składnia wiersza poleceń
Ogólne zastosowanie polecenia logcat
w powłoce adb
to:
[adb] shell logcat [<option>] ... [<filter-spec>] ...
Występuje też skrót adb logcat
, który dotyczy tylko słowa
adb shell logcat
Opcje
logcat
oferuje wiele opcji. Dostępne opcje zależą od systemu operacyjnego
wersji używanego urządzenia. Aby uzyskać pomoc dotyczącą usługi logcat
dostosowaną do
urządzenia, którego używasz, wykonaj:
adb logcat --help
Pamiętaj, że logcat
jest narzędziem dla deweloperów systemów operacyjnych i aplikacji
(deweloperzy aplikacji powinni używać Android Studio) wiele z tych opcji jest
do wykorzystania jako root
.
Filtruj wyniki dziennika
Tag komunikatu logu to krótki ciąg znaków wskazujący komponent systemu, w którym Na przykład „Widok”. dla systemu widoków.
Priorytet to jedna z tych wartości znaków, posortowana od najniższego do najwyższego priorytet:
V
: szczegółowy (najniższy priorytet)D
: debugowanieI
: informacjeW
: ostrzeżenieE
: błądF
: błąd krytycznyS
: bez dźwięku (najwyższy priorytet – nic nigdy nie jest wydrukowane)
Aby uzyskać listę tagów używanych w systemie z priorytetami, uruchom polecenie
logcat
i sprawdź 2 pierwsze kolumny każdej wiadomości, podane jako
<priority>/<tag>
Oto przykład krótkich danych wyjściowych logcat
uzyskanych za pomocą funkcji
logcat -v brief output
. Dane wyjściowe wskazują, że komunikat dotyczy
priorytet „I” i oznaczyć tagiem „ActivityManager”:
I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}
Aby zmniejszyć ilość danych wyjściowych logów, ogranicz dane wyjściowe logów za pomocą filtra . Wyrażenia filtra umożliwiają wskazanie systemowi priorytetu tagów które Cię interesują. System ukrywa inne wiadomości dla określonych tagów.
Wyrażenie filtra ma format tag:priority ...
, gdzie tag
wskazuje tag zainteresowania, a priority
wskazuje minimalny poziom
priorytet raportowania dla tego tagu. Wiadomości z tym tagiem o określonym lub wyższym priorytecie są
zapisane w dzienniku. Podaj dowolną liczbę specyfikacji tag:priority
w
jako wyrażenia filtra. Seria specyfikacji jest rozdzielana spacjami.
Poniżej znajdziesz przykład wyrażenia filtra, które pomija wszystkie komunikaty logu oprócz z tagiem „ActivityManager” z priorytetem „Informacje” lub wyższym i tych z tagiem, „MojaAplikacja” z priorytetem „Debugowanie” lub więcej:
adb logcat ActivityManager:I MyApp:D *:S
Ostatni element w poprzednim wyrażeniu, *:S
, ustawia poziom priorytetu dla argumentu
wszystkie tagi są wyciszone, co zapewnia, że rejestrowane są tylko wiadomości z obiektem „ActivityManager” i „MojaAplikacja” to
wyświetlenie. Użycie metody *:S
pozwala mieć pewność, że dane wyjściowe logów będą ograniczone do
do określonych przez Ciebie filtrów. *:S
umożliwia stosowanie filtrów jako
lista dozwolonych danych wyjściowych logów.
Uwaga: w niektórych powłokach element „*
” jest zarezerwowany przez powłokę. Jeśli
używasz takiej powłoki, umieść wyrażenie filtra w cudzysłowie: adb logcat
"ActivityManager:I MyApp:D *:S"
To wyrażenie filtra wyświetla wszystkie komunikaty logu z priorytetem „warning” oraz wyższa we wszystkich tagach:
adb logcat *:W
Jeśli aplikacja logcat
jest uruchomiona na komputerze programistycznym, a nie na
zdalną adb
, możesz też ustawić domyślne wyrażenie filtra, eksportując wartość atrybutu
zmienna środowiskowa ANDROID_LOG_TAGS
:
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
Filtr ANDROID_LOG_TAGS
nie jest eksportowany do emulatora/urządzenia
jeśli uruchamiasz logcat
ze zdalnej powłoki lub używasz adb shell
logcat
.
Format wyjściowy dziennika kontrolnego
Oprócz tagu i priorytetu wiadomości logu zawierają wiele pól metadanych. Dostępne opcje
zmodyfikować format wyjściowy wiadomości, tak 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 PID procesu, który .long
: wyświetla wszystkie pola metadanych i rozdziela wiadomości puste .process
: wyświetla tylko identyfikator 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 obiektu w wątku publikującym wiadomość.threadtime
(domyślnie): wyświetla datę, czas wywołania, priorytet, tagu, PID i TID wątku, który wysłał wiadomość.time
: wyświetla datę, czas wywołania, priorytet, tag i identyfikator PID procesu wysyłania wiadomości.
Uruchamiając polecenie logcat
, określ format wyjściowy za pomocą funkcji
Opcja -v
:
[adb] logcat [-v <format>]
Ten przykład pokazuje, jak generować wiadomości w danych wyjściowych thread
format:
adb logcat -v thread
Za pomocą opcji -v
możesz określić tylko jeden format wyjściowy. Musisz jednak
możesz 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 jest powiązany tag i priorytet. Dowolny modyfikator formatu możesz połączyć 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
wiersz poleceń:
color
: każdy poziom priorytetu ma inny kolor.descriptive
: pokazuje opisy zdarzeń w buforze dziennika. Ten modyfikator wpływa na zdarzenie tylko wiadomości buforów dziennika i nie ma to wpływu na inne bufory niebinarne. Wydarzenie pochodzą z bazy danych tagów dzienników zdarzeń.epoch
: wyświetla czas w sekundach od 1 stycznia 1970 r.monotonic
: wyświetla czas w sekundach procesora od ostatniego uruchomienia.printable
: zapewnia zmianę znaczenia każdej treści logowania binarnego.uid
: jeśli pozwala na to kontrola dostępu, wyświetla identyfikator UID lub identyfikator Androida zapisany proces.usec
: wyświetla godzinę z dokładnością do mikrosekund.UTC
: wyświetla godzinę w strefie czasowej UTC.year
: dodaje rok do wyświetlanego czasu.zone
: dodaje lokalną strefę czasową do wyświetlanego czasu.
Wyświetl alternatywne bufory logu
System logowania Androida przechowuje wiele cyklicznych buforów na potrzeby komunikatów dziennika, a nie wszystkie
są wysyłane do domyślnego bufora cyklicznego. Aby wyświetlić dodatkowe komunikaty logu,
uruchom polecenie logcat
z opcją -b
, aby poprosić o wyświetlenie
naprzemienny bufor kołowy. Możesz wyświetlić dowolny z tych alternatywnych buforów:
radio
: wyświetla bufor zawierający połączenie radio/telekomunikacyjne. wiadomości.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 logu systemowego (domyślnie).crash
: wyświetla bufor dziennika awarii (domyślnie).all
: wyświetla wszystkie bufory.default
: raportymain
,system
i Bufory:crash
.
Zastosowanie opcji -b
:
[adb] logcat [-b <buffer>]
Oto przykład, jak wyświetlić bufor dziennika zawierający wiadomości radiowe i telefoniczne:
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.
np.:
logcat -b main,radio,events
Zapisz z kodu
Zajęcia Log
umożliwiają tworzenie
wpisy logu w kodzie, które są wyświetlane w narzędziu logcat
. Typowe metody rejestrowania:
Log.v(String, String)
(szczegółowy)Log.d(String, String)
(debugowanie)Log.i(String, String)
(informacje)Log.w(String, String)
(ostrzeżenie)Log.e(String, String)
(błąd)
Możesz na przykład użyć 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