Logcat — to narzędzie Android SDK do przeglądania komunikatów systemowych i logów aplikacji w czasie rzeczywistym, dostępne przez ADB lub wbudowaną konsolę Android Studio. Według Android Developers, Logcat zbiera komunikaty ze wszystkich procesów systemu, filtruje je według poziomów ważności i tagów oraz pozwala programiście diagnozować błędy, śledzić wykonywanie kodu i analizować wydajność. Logcat — główne źródło informacji podczas debugowania aplikacji Android.
Najważniejsze
Logcat — to systemowy bufor Androida, do którego wszystkie procesy (w tym jądro Linux, system_server i aplikacje) zapisują komunikaty w określonym formacie. Narzędzie logcat, wchodzące w skład Android SDK, odczytuje ten bufor i wyświetla komunikaty w czasie rzeczywistym. Od Androida 4.1 (API 16) dostęp do Logcat jest ograniczony: aplikacje mogą czytać tylko swoje logi, a logi systemowe są dostępne przez ADB z dostępem debug.
Każdy komunikat Logcat zawiera pięć pól: datę i czas, PID (identyfikator procesu), TID (identyfikator wątku), poziom logowania i tag. Format jest stały i taki sam dla wszystkich wersji Androida. Umożliwia to używanie narzędzi grep, awk i sed do filtrowania logów w pipeline CI/CD bez przywiązania do IDE.
Logi są przechowywane w buforze cyklicznym o stałym rozmiarze: 256 KB dla main, 256 KB dla system i 256 KB dla events (Android 5+). Po przepełnieniu bufora stare komunikaty są usuwane. Programista może zmienić rozmiar bufora przez PROP logcat.size lub w ustawieniach programisty urządzenia.
Sześć poziomów logowania określa ważność komunikatu. Android używa standardowych poziomów, podobnych do innych platform, ale z własnymi nazwami stałych w klasie Log. Wybór odpowiedniego poziomu pomaga skutecznie filtrować logi i nie zagłuszać krytycznych komunikatów drugorzędnymi.
| Poziom | Stała | Przeznaczenie | Wyświetlany domyślnie |
|---|---|---|---|
| VERBOSE | Log.v | Maksymalnie szczegółowe informacje debugowania | Nie |
| DEBUG | Log.d | Komunikaty debugowania dla programisty | Nie |
| INFO | Log.i | Komunikaty informacyjne o działaniu aplikacji | Tak |
| WARN | Log.w | Ostrzeżenia o potencjalnych problemach | Tak |
| ERROR | Log.e | Krytyczne błędy i wyjątki | Tak |
| ASSERT | Log.wtf | Błędy, które w ogóle nie powinny wystąpić | Tak |
Tag — ciąg do 23 znaków identyfikujący źródło komunikatu. Zaleca się używanie nazwy klasy lub modułu jako taga: MainActivity, AuthManager, NetworkModule. Umożliwia to filtrowanie logów według konkretnego komponentu aplikacji. Dla spójności w zespole można utworzyć stałe tagów w osobnym pliku lub użyć biblioteki Timber, która automatycznie podstawia tag według nazwy klasy.
Przy nieobsłużonym wyjątku Android sam zapisuje w Logcat pełny stack trace z wskazaniem klasy, metody, linii kodu i łańcucha wywołań. Log crasha zawiera typ wyjątku (NullPointerException, RuntimeException), komunikat i sekwencję wywołań od punktu awarii do entry point aplikacji. Do analizy logów crashy z urządzeń użytkowników używa się Firebase Crashlytics, który synchronizuje stack trace z mapą obfuskacji (mapping.txt dla Androida).
Android Studio udostępnia graficzny interfejs Logcat, dostępny przez View → Tool Windows → Logcat (Alt + 6). Okno Logcat aktualizuje się w czasie rzeczywistym, pokazuje wszystkie komunikaty podłączonego urządzenia i pozwala konfigurować elastyczne filtry do wyodrębniania potrzebnych informacji z ogólnego strumienia.
Lista rozwijana Log Level filtruje komunikaty według minimalnego poziomu: wybierz WARN, aby widzieć tylko ostrzeżenia i błędy, ukrywając VERBOSE, DEBUG i INFO. Pole Search umożliwia wyszukiwanie według tekstu komunikatu lub taga — obsługuje regex, co jest wygodne do wyszukiwania komunikatów według wzorca.
Saved Filters — potężna funkcja Logcat w Android Studio. Możesz utworzyć filtr, który pokazuje tylko komunikaty z tagiem twojej aplikacji (tag:MyApp) i poziomem WARN+. Filtry są zapisywane między sesjami i dostępne z listy rozwijanej. Dla projektów z wieloma modułami utwórz osobny filtr dla każdego modułu.
# Przykładowe wyrażenie do filtrowania logów aplikacji
tag:"MyApp" level:WARN # Tylko WARN+ dla MyApp
package:"com.mycompany" # Wszystkie logi pakietu
-tag:"okhttp" # Wyklucz logi OkHttp
Logi Logcat można eksportować do pliku tekstowego przez ikonę Save to File. Jest to przydatne do dołączania do zgłoszeń w Jira lub analizy długich sesji. Wyeksportowany log można otworzyć w dowolnym edytorze tekstu i zastosować grep do wyszukiwania wzorców. Do sformatowanego podglądu użyj narzędzia logcat-color.
ADB logcat — konsolowa wersja Logcat, dostępna przez Android Debug Bridge. Jej główną zaletą jest możliwość uruchomienia na serwerach CI, w skryptach automatyzacji i na urządzeniach bez Android Studio. ADB logcat obsługuje wszystkie te same filtry co GUI, ale z elastycznością wiersza poleceń.
Polecenie adb logcat bez argumentów wyświetla cały bufor w czasie rzeczywistym. Do zatrzymania użyj Ctrl+C. Flaga -c czyści bufor przed rozpoczęciem zapisu — jest to wygodne, gdy trzeba wyizolować logi bieżącego testu od poprzednich komunikatów. Flaga -b wybiera typ bufora: main, system, events, crash (Android 12+).
# Wyczyść bufor i rozpocznij zapis logów z tagiem MyApp
adb logcat -c
adb logcat MyApp:D *:S
# Zapisz logi do pliku
adb logcat -d > logcat_dump.txt
# Filtrowanie według PID procesu
adb logcat --pid=12345
Połączenie ADB z narzędziami uniksowymi daje maksymalną elastyczność. Na przykład filtr "*:S TAG:D" pokazuje tylko komunikaty z tagiem TAG o poziomie DEBUG i wyższym, ukrywając wszystkie inne. Do przeglądania tylko Exception użyj grep -i exception. Do analizy częstotliwości błędów zastosuj sort | uniq -c na kolumnie taga.
Na serwerach CI Logcat jest używany do zbierania diagnostyki podczas uruchamiania testów UI. Typowy pipeline: przed uruchomieniem testów bufor jest czyszczony, po wykonaniu testów — zrzut logów jest zapisywany jako artefakt kompilacji. Jeśli test się nie powiódł, na podstawie logów można określić, czy awaria została spowodowana przez ANR, nieobsłużony wyjątek lub timeout sieciowy.
Klasa android.util.Log — wbudowane API do zapisywania komunikatów w Logcat. Log.v, Log.d, Log.i, Log.w, Log.e i Log.wtf przyjmują tag (ciąg) i komunikat (ciąg) lub komunikat + Throwable. Do formatowania komunikatów używaj String.format lub Kotlin String templates — unikaj konkatenacji ciągów, która tworzy zbędne obiekty w stercie.
Timber — popularna biblioteka Jake'a Whartona, która eliminuje wady wbudowanego API Log. Timber automatycznie podstawia tag według nazwy klasy, która wywołała logowanie, i nie wymaga przekazywania tagu w każdym wywołaniu. Timber obsługuje również warunkowe logowanie: w kompilacji Release wywołania Timber.v i Timber.d można wyłączyć jedną linią w Application.onCreate.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Wbudowane API Log
Log.d("MainActivity", "onCreate called")
// Timber — automatyczny tag na podstawie nazwy klasy
Timber.d("onCreate called")
}
private fun loadData() {
try {
val result = fetchFromNetwork()
Timber.i("Data loaded: $result")
} catch (e: IOException) {
Timber.e(e, "Failed to load data")
}
}
}
W kompilacji Release zaleca się wyłączenie logów VERBOSE i DEBUG, aby zmniejszyć obciążenie bufora Logcat i wykluczyć wyciek wrażliwych informacji. Timber rozwiązuje to zadanie przez PlantingTree: w flavorze Debug sadzony jest DebugTree (loguje wszystko), w Release — CrashReportingTree (loguje tylko ERROR przez Crashlytics). Wbudowane API Log nie obsługuje warunkowego logowania — programista musi opakować każde wywołanie w if (BuildConfig.DEBUG).
Często zadawane pytania
Użyj polecenia adb logcat -c przed uruchomieniem testu. Alternatywnie w Android Studio naciśnij przycisk Clear Logcat (kosz) w oknie Logcat. Czyszczenie nie wpływa na systemowe bufory innych procesów, tylko na bieżące połączenie.
Wykonaj adb logcat -G 2M, aby zwiększyć bufor do 2 MB. Maksymalny rozmiar zależy od urządzenia: na Android 10+ dostępne jest do 16 MB. Zmiana jest zachowywana do ponownego uruchomienia urządzenia. Do stałej konfiguracji użyj build.prop w device tree.
Możliwe przyczyny: aplikacja jest uruchomiona w trybie Release (logi Timber.v/d wyłączone), filtr Logcat ukrywa potrzebny poziom lub jesteś podłączony do niewłaściwego urządzenia. Sprawdź również, czy w Android Studio wybrany jest proces aplikacji, a nie system_process.
Znajdź linię z FATAL EXCEPTION, pod którą znajduje się pełny stack trace. Pierwsza linia zawiera typ wyjątku i komunikat, kolejne linie — łańcuch wywołań z wskazaniem pliku i linii kodu. Użyj grep "FATAL EXCEPTION" do szybkiego wyszukiwania wśród wszystkich logów.
ANR (Application Not Responding) — sytuacja, gdy główny wątek (UI thread) jest zablokowany przez ponad 5 sekund. W Logcat ANR wygląda jak komunikat z tagiem ActivityManager i tekstem "ANR in ..." z dołączonym stack trace wszystkich wątków. Użyj filtru tag:ActivityManager level:ERROR.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również