Maybaygiare.org

Blog Network

narzędzie wiersza poleceń Logcat

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 VERBOSEDEBUGINFOWARNINGERROR 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:

  1. 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.
  2. 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ą tag MyApp, następujące właściwości są sprawdzane i powinny zawierać pierwszą literę o minimalnej ważności (VDIWE lub S aby wyłączyć wszystkie dzienniki):
  • log.tag.MyApp
  • persist.log.tag.MyApp
  • log.tag
  • persist.log.tag
  • filtrowanie aplikacji: Jeśli żadna z właściwości nie jest ustawiona, liblog używa minimalnego priorytetu ustawionego przez __android_log_set_minimum_priority. Domyślne ustawienie to INFO.
  • filtrowanie wyświetlania: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.

    -c, --clear

    -e <expr>, --regex=<expr>

    -m <count>, --max-count=<count>

    --print

    -d

    -f <filename>

    -g, --buffer-size

    -n <count>

    -r <kbytes>

    -s

    -v <format>

    -D, --dividers

    -c

    -t <count>

    -t '<time>'

    -T <count>

    -T '<time>'

    -L, -last

    -B, --binary

    -S, --statistics

    -G <size>

    -p, --prune

    -P '<list> ...'
    --prune '<list> ...' -P '<white_and_black_list>'

    --wrap

    opcja opis
    -b <buffer> załaduj alternatywny bufor dziennika do przeglądania, taki jak eventslubradio. Domyślnie używany jest zestaw buforówmainsystem orazcrash. Zobacz Przeglądanie Alternatywnych Buforów Dziennika.
    Wyczyść (opróżnij) wybrane bufory i zakończ. Domyślny zestaw buforów to mainsystem 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 --regexI --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:

    • zapewniają najwyższą trwałość określonej zawartości logowania poprzez wybór UID.
    • uniemożliwić komuś (UID) lub czemuś (PID) zużywanie tych zasobów, aby zwiększyć logspan, dzięki czemu możesz mieć większy wgląd w diagnozowane problemy.

    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 (whitelist) chroni Twój numer identyfikacyjny Androida (AID), który staje się pomocą procesów i identyfikatorem GID przed ogłoszeniem przestępcy, a dodanie listy denylist pomaga zwolnić miejsce, zanim najgorsi przestępcy zostaną uznani za sprawców. Możesz wybrać, jak aktywne jest przycinanie, i możesz wyłączyć przycinanie, aby usuwało tylko zawartość z najstarszych wpisów w każdym buforze dziennika.

    cudzysłów

    adb logcat nie zachowuje cudzysłowów, więc składnia dla określenia list allow (white) I deny (black) wygląda następująco:

    $ adb logcat -P '"<white_and_blacklist>"'oradb shell$ logcat -P '<white_and_blacklist>'

    poniższy przykład określa listę allow (white) z PID 32676 i UID 675 oraz listę deny (black) z PID 32677 i UID 897. PID 32677 na denylist jest ważony dla szybszego przycinania.

    adb logcat -P '"/32676 675 ~/32677 897"'

    Inne Zezwalaj (white) I odmawiaj (black) Opcje listy poleceń, których możesz użyć, są następujące:

    ~! 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: brieflongprocessrawtagthreadthreadtime, 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: raportymainsystem 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

    Dodaj komentarz

    Twój adres e-mail nie zostanie opublikowany.