Logcat jest narzędziem wiersza poleceń, które wyrzuca dziennik komunikatów systemowych, w tym śledzenia stosu, gdy urządzenie wyrzuca błąd i wiadomości, które zostały napisane z aplikacji za pomocąLog
klasy.
ta strona dotyczy narzędzia logcat z wiersza poleceń, ale możesz także przeglądać wiadomości z okna Logcat w Android Studio. Aby uzyskać informacje na temat przeglądania i filtrowania dzienników z Android Studio, zobacz Zapisywanie i Wyświetlanie dzienników withLogcat.
przegląd systemu logowania
system logowania Android jest zbiorem strukturalnych buforów okrągłych utrzymywanych przez proces systemowylogd
. Zestaw dostępnych buforów jest stały i zdefiniowany przez system. Najważniejsze z nich to: main
, który przechowuje większość dzienników aplikacji, system
, który przechowuje wiadomości pochodzące z systemu operacyjnego Android oraz crash
, który przechowuje dzienniki awarii. Każdy wpis dziennika ma priorytet (jeden z VERBOSE
DEBUG
INFO
WARNING
ERROR
lub FATAL
), znacznik, który identyfikuje pochodzenie dziennika i rzeczywistą wiadomość dziennika.
podstawowym interfejsem do systemu logowania jest biblioteka współdzielonaliblog
i jej nagłówek<android/log.h>
. Wszystkie funkcje logowania specyficzne dla danego języka wywołują ostatecznie funkcję __android_log_write
. Domyślnie wywołuje funkcję __android_log_logd_logger
, która wysyła wpis dziennika do logd
za pomocą gniazda. Począwszy od poziomu API 30, funkcję logowania można zmienić wywołując __android_set_log_writer
. Więcej informacji znajduje się w dokumentacji NDK.
Logi wyświetlane przezadb logcat
przechodzą cztery poziomy filtrowania:
- filtrowanie czasu kompilacji: w zależności od ustawień kompilacji, niektóre logi mogą być całkowicie usunięte z pliku binarnego. Na przykład Proguard może być skonfigurowany tak, aby usuwać wywołania do
Log.d
z kodu Java. - filtrowanie właściwości systemu:
liblog
zapytuje zestaw właściwości systemu, aby określić minimalny poziom ważności, który ma zostać wysłany dologd
. Jeśli Twoje dzienniki mają tagMyApp
, następujące właściwości są sprawdzane i powinny zawierać pierwszą literę o minimalnej ważności (V
D
I
W
E
lubS
aby wyłączyć wszystkie dzienniki):
log.tag.MyApp
persist.log.tag.MyApp
log.tag
persist.log.tag
liblog
używa minimalnego priorytetu ustawionego przez __android_log_set_minimum_priority
. Domyślne ustawienie to INFO
.adb logcat
obsługuje dodatkowe filtry, które mogą zmniejszyć ilość logów wyświetlanych zlogd
. Szczegóły poniżej.składnia wiersza poleceń
aby uruchomić logcat przez powłokę adb, ogólne zastosowanie to:
logcat ... ...
możesz uruchomićlogcat
jako polecenie adb lub bezpośrednio w monicie powłoki emulatora lub podłączonego urządzenia. Aby wyświetlić wyjście dziennika za pomocą adb, przejdź do katalogu SDK platform-tools/
I wykonaj:
adb logcat
dla logcat
pomoc online, uruchom urządzenie, a następnie wykonaj:
adb logcat --help
możesz utworzyć połączenie powłoki z urządzeniem i wykonać:
$ adb shell# logcat
opcje
poniższa tabela opisuje opcje linii poleceńlogcat
.
opcja | opis | -b <buffer>
|
załaduj alternatywny bufor dziennika do przeglądania, taki jak events lubradio . Domyślnie używany jest zestaw buforówmain system orazcrash . Zobacz Przeglądanie Alternatywnych Buforów Dziennika. |
---|---|
Wyczyść (opróżnij) wybrane bufory i zakończ. Domyślny zestaw buforów to main system I crash . Aby wyczyścić wszystkie bufory, użyj -b all -c . |
|
wypisuje tylko wiersze, w których komunikat dziennika pasuje do <expr> gdzie <expr> jest wyrażeniem regularnym. |
|
Zamknij po wydrukowaniu <count> liczba linii. Ma to być sparowane z --regex , ale będzie działać samodzielnie. |
|
sparowane z --regex I --max-count , aby zawartość ominęła filtr regex, ale nadal zatrzymuje się na właściwej liczbie dopasowań. |
|
zrzuca dziennik na ekran i kończy działanie. | |
Zapisz wyjście wiadomości dziennika do <filename> . Domyślnie jest to stdout . |
|
wypisuje rozmiar podanego bufora dziennika i kończy działanie. | |
Ustaw maksymalną liczbę obróconych dzienników na <count> . Wartością domyślną jest 4. Wymaga opcji -r . |
|
Obróć plik dziennika co <kbytes> wyjścia. Domyślną wartością jest 16. Wymaga opcji -f . |
|
odpowiednik wyrażenia filtrującego '*:S' , które ustawia priorytet dla wszystkich tagów na cichy i jest używane do poprzedzania listy wyrażeń filtrujących, które dodają zawartość. Aby dowiedzieć się więcej, przejdź do sekcji Filtrowanie danych wyjściowych dziennika. |
|
Ustaw format wyjściowy dla wiadomości dziennika. Domyślnym formatem jestthreadtime . Aby uzyskać listę obsługiwanych formatów, przejdź do sekcji o formacie wyjściowym dziennika sterowania. |
|
drukuje dzielniki pomiędzy każdym buforem dziennika. | |
spłucz (Wyczyść) cały dziennik i zakończ. | |
wypisuje tylko najnowszą liczbę wierszy. Ta opcja zawiera funkcjonalność-d . |
|
wypisuje najnowsze linie od podanego czasu. Ta opcja zawiera funkcjonalność-d . Zobacz opcję-P, aby uzyskać informacje na temat cytowania parametrów z osadzonymi spacjami.
adb logcat -t '01-26 20:52:41.820' |
|
wypisuje najnowszą liczbę linii od podanego czasu. Opcja ta nie obejmuje-d funkcjonalność |
|
wypisuje najnowsze linie od podanego czasu. Opcja ta nie obejmuje funkcji include -d . Zobacz opcję-P, aby uzyskać informacje na temat cytowania parametrów z osadzonymi spacjami.
adb logcat -t '01-26 20:52:41.820' |
|
zrzuć logi przed ostatnim restartem. | |
wyprowadza log w pliku binarnym. | |
Dołącz statystyki do wyjścia, aby pomóc ci zidentyfikować i namierzyć spamerów dziennika. | |
Ustaw rozmiar bufora pierścienia dziennika. Można dodać K lub M na końcu, aby wskazać kilobajty lub megabajty. |
|
drukuje (odczytuje) bieżące allow (white ) I deny (black ) wyświetla i nie pobiera żadnych argumentów, w następujący sposób:
adb logcat -p |
|
Zapisz (Ustaw) listy allow (white ) I deny (black ), aby dostosować listę rejestrowanie treści w określonym celu. Podajesz mieszaną zawartość dozwolonych (<white> ) I odrzuconych (~<black> ) wpisów listy, gdzie<white> lub<black> może być UID, UID/PID lub /PID. Dzięki wskazówkom ze statystyk logcat (logcat -S ) można rozważyć dostosowanie list allow (white ) I deny (black ) do celów takich jak:
Domyślnie system logowania automatycznie zapobiega najgorszemu sprawcy w statystykach logów, aby zrobić miejsce na nowe komunikaty logów. Po wyczerpaniu heurystyki system wycina najstarsze wpisy, aby zrobić miejsce na nowe wiadomości. dodanie listy dozwolonych ( cudzysłów
$ adb logcat -P '"<white_and_blacklist>"'oradb shell$ logcat -P '<white_and_blacklist>' poniższy przykład określa listę allow ( adb logcat -P '"/32676 675 ~/32677 897"' Inne Zezwalaj ( ~! worst uid blacklist~1000/! worst pid in system (1000) |
|
--pid=<pid> ... |
wypisuje tylko logi z podanego pid. |
sen przez 2 godziny lub gdy bufor ma się owinąć, w zależności od tego, co nastąpi wcześniej. Poprawia efektywność sondaży, zapewniając wakeup o-to-wrap. |
filtrowanie wyjścia dziennika
- znacznik wiadomości dziennika jest krótkim łańcuchem wskazującym komponent systemowy, z którego pochodzi wiadomość (na przykład „widok” dla systemu widoku).
- priorytet jest jedną z następujących wartości znaków, uporządkowanych od najniższego do najwyższego priorytetu:
-
-
V
: Verbose (lowest priority) -
D
: Debug -
I
: info -
W
: Uwaga -
E
: Error -
F
: Fatal -
S
: Silent (najwyższy priorytet, na którym nigdy nie jest drukowany)
-
listę tagów używanych w systemie, z priorytetami, można uzyskać, uruchamiając logcat i obserwując pierwsze dwie kolumny każdej wiadomości, podane jako <priority>/<tag>
.
poniżej znajduje się przykład krótkiego wyjścia logcat uzyskanego za pomocą polecenia logcat -v brief output
. Pokazuje, że wiadomość odnosi się do poziomu Priorytetu ” I „i tag „ActivityManager”:
I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}
aby zmniejszyć wyjście dziennika do poziomu, który można kontrolować, możesz ograniczyć wyjście dziennika za pomocą wyrażeń filtrów. Wyrażenia filtrujące pozwalają wskazać systemowi tagi-kombinacje priorytetów, które Cię interesują-system tłumi inne wiadomości dla określonych tagów.
wyrażenie filtra podąża za tym formatemtag:priority ...
, gdzietag
wskazuje interesujący znacznik, apriority
wskazuje minimalny poziom priorytetu raportowania dla tego znacznika. Wiadomości dla tego tagu o określonym priorytecie lub nad nim są zapisywane do dziennika. Możesz podać dowolną liczbę tag:priority
specyfikacji w jednym wyrażeniu filtra. Seria specyfikacji jest rozdzielana spacjami.
oto przykład wyrażenia filtra, które tłumi wszystkie wiadomości dziennika z wyjątkiem tych z tagiem „ActivityManager”, o priorytecie „Info” lub wyższym, i wszystkie wiadomości dziennika z tagiem „MyApp”, o priorytecie” Debug ” lub wyższym:
adb logcat ActivityManager:I MyApp:D *:S
ostatni element powyższego wyrażenia,*:S
, ustawia poziom priorytetu dla wszystkich tagów na „cichy”, zapewniając w ten sposób wyświetlanie tylko wiadomości dziennika z „ActivityManager” i „MyApp”. Użycie *:S
jest doskonałym sposobem, aby zapewnić, że wyjście dziennika jest ograniczone do filtrów, które zostały wyraźnie określone — pozwala filtrom służyć jako lista dozwolonych dla wyjścia dziennika.
poniższe wyrażenie filtra wyświetla wszystkie komunikaty dziennika z priorytetem „warning” i wyższym, na wszystkich znacznikach:
adb logcat *:W
jeśli uruchamiasz logcat z komputera deweloperskiego (w przeciwieństwie do uruchamiania go na zdalnej powłoce adb), możesz również ustawić domyślne wyrażenie filtra, eksportując wartość dla zmiennej środowiskowej ANDROID_LOG_TAGS
:
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
zauważ, że
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
ANDROID_LOG_TAGS
filtr nie jest eksportowany do instancji emulatora/urządzenia, jeśli używasz logcat ze zdalnej powłoki lub używasz adb shell logcat
.
format wyjściowy dziennika sterowania
wiadomości dziennika zawierają wiele pól metadanych, oprócz znacznika i priorytetu. Format wyjściowy wiadomości można modyfikować tak, aby wyświetlały one określone pole metadanych. Aby to zrobić, użyj opcji -v
I określ jeden z obsługiwanych formatów wyjściowych wymienionych poniżej.
-
brief
: wyświetla priorytet, tag i PID procesu wydającego wiadomość. -
long
: wyświetla wszystkie pola metadanych i oddzielne wiadomości z pustymi liniami. -
process
: Wyświetl tylko PID. -
raw
: wyświetla surowy komunikat dziennika bez innych pól metadanych. -
tag
: wyświetla tylko priorytet i tag. -
thread:
stary format, który pokazuje priorytet, PID i TID wątku wysyłającego wiadomość. -
threadtime
(domyślnie): wyświetla datę, czas wywołania, priorytet, tag, PID i TID wątku wysyłającego wiadomość. -
time
: wyświetla datę, czas wywołania, priorytet, tag i PID procesu wydającego wiadomość.
uruchamiając logcat, możesz określić żądany format wyjściowy, korzystając z opcji-v
:
logcat
oto przykład, który pokazuje, jak generować wiadomości wthread
format wyjściowy:
adb logcat -v thread
zauważ, że możesz określić tylko jeden format wyjściowy za pomocą opcji-v
, ale możesz określić tyle modyfikatorów, które mają sens. Logcat ignoruje modyfikatory, które nie mają sensu.
modyfikatory formatu
modyfikatory formatu zmieniają wyjście logcat pod względem dowolnej kombinacji jednego lub więcej z następujących modyfikatorów. Aby określić modyfikator formatu, użyj opcji-v
, w następujący sposób:
adb logcat -b all -v color -d
każda wiadomość dziennika Androida ma tag i przypisany priorytet. Możesz połączyć dowolny modyfikator formatu z jedną z następujących opcji formatu: brief
long
process
raw
tag
thread
threadtime
, and time
.
You can get the format modifier details by typing logcat -v --help
at the command line.
-
color
: Show each priority level with a different color. -
descriptive
: Show log buffer event descriptions. Ten modyfikator wpływa tylko na komunikaty bufora dziennika zdarzeń i nie ma wpływu na inne bufory niebinarne. Opisy zdarzeń pochodzą z bazy event-log-tags. -
epoch
: Wyświetlanie czasu w sekundach od 1 stycznia 1970. -
monotonic
: Wyświetlanie czasu w sekundach procesora, począwszy od ostatniego rozruchu. -
printable
: upewnij się, że każda zawartość logowania binarnego jest uniknięta. -
uid
: jeśli jest to dozwolone przez kontrolę dostępu, wyświetla UID lub Android ID zalogowanego procesu. -
usec
: wyświetla czas z dokładnością do mikrosekund. -
UTC
: wyświetla czas jako UTC. -
year
: Dodaj rok do wyświetlonego czasu. -
zone
: Dodaj lokalną strefę czasową do wyświetlonego czasu.
przeglądanie alternatywnych buforów dziennika
system rejestrowania Androida zachowuje wiele okrągłych buforów dla wiadomości dziennika, a nie wszystkie wiadomości dziennika są wysyłane do domyślnego okrągłego bufora. Aby zobaczyć dodatkowe komunikaty dziennika, możesz uruchomić polecenielogcat
z opcją-b
, aby zażądać wyświetlenia alternatywnego bufora okrągłego. Możesz wyświetlić dowolny z tych alternatywnych buforów:
-
radio
: wyświetl bufor zawierający wiadomości związane z radiem / telefonią. -
events
: wyświetla zinterpretowane komunikaty bufora zdarzeń systemu binarnego. -
main
: wyświetl główny bufor dziennika (domyślnie) nie zawiera komunikatów dziennika systemu i awarii. - : Wyświetl bufor dziennika systemowego (domyślnie).
-
crash
: wyświetlanie bufora dziennika awarii (domyślnie). -
all
: wyświetl wszystkie bufory. -
default
: raportymain
system
Icrash
bufory.
użycie opcji-b
to:
logcat
oto przykład jak wyświetlić bufor dziennika zawierający wiadomości radiowe i telefoniczne:
adb logcat -b radio
Możesz również określić wiele -b
flagi dla wszystkich buforów, które chcesz wydrukować, w następujący sposób:
logcat -b main -b radio -b events
możesz określić pojedynczą -b
flaga z rozdzielona przecinkami lista buforów, na przykład:
logcat -b main,radio,events
logowanie z kodu
Klasa Log
umożliwia tworzenie wpisów dziennika w kodzie, które są wyświetlane w narzędziu logcat. Typowe metody logowania obejmują:
-
Log.v(String, String)
(verbose) -
Log.d(String, String)
(debug) -
Log.i(String, String)
(information) -
Log.w(String, String)
(warning) -
Log.e(String, String)
(error)
For example, using the following call:
Kotlin
Log.i("MyActivity", "MyClass.getView() — get item number $position")
Java
Log.i("MyActivity", "MyClass.getView() — get item number " + position);
The logcat outputs something like:
I/MyActivity( 1557): MyClass.getView() — get item number 1