Logcat — це інструмент Android SDK для перегляду системних повідомлень і логів застосунків у реальному часі, доступний через ADB або вбудовану консоль Android Studio. Згідно з Android Developers, Logcat збирає повідомлення від усіх процесів системи, фільтрує їх за рівнями важливості та тегами й дозволяє розробнику діагностувати помилки, відстежувати виконання коду та аналізувати продуктивність. Logcat — основне джерело інформації під час налагодження Android-застосунків.
Головне
Logcat — це системний буфер Android, у який усі процеси (включно з ядром Linux, system_server та застосунками) записують повідомлення певного формату. Інструмент logcat, що входить до складу Android SDK, читає цей буфер і виводить повідомлення в реальному часі. Починаючи з Android 4.1 (API 16), доступ до Logcat обмежений: застосунки можуть читати лише власні логи, а системні логи доступні через ADB з debug-доступом.
Кожне повідомлення Logcat містить п'ять полів: дата та час, PID (ідентифікатор процесу), TID (ідентифікатор потоку), рівень логування та тег. Формат фіксований та однаковий для всіх версій Android. Це дозволяє використовувати утиліти grep, awk та sed для фільтрації логів у CI/CD-пайплайнах без прив'язки до IDE.
Логи зберігаються в кільцевому буфері фіксованого розміру: 256 КБ для main, 256 КБ для system та 256 КБ для events (Android 5+). При переповненні буфера старі повідомлення видаляються. Розробник може змінити розмір буфера через PROP logcat.size або в налаштуваннях розробника пристрою.
Шість рівнів логування визначають важливість повідомлення. Android використовує стандартні рівні, аналогічні іншим платформам, але з власними назвами констант у класі Log. Вибір правильного рівня допомагає ефективно фільтрувати логи та не заглушати критичні повідомлення другорядними.
| Рівень | Константа | Призначення | Відображається за замовчуванням |
|---|---|---|---|
| VERBOSE | Log.v | Максимально детальна налагоджувальна інформація | Ні |
| DEBUG | Log.d | Налагоджувальні повідомлення для розробника | Ні |
| INFO | Log.i | Інформаційні повідомлення про роботу застосунку | Так |
| WARN | Log.w | Попередження про потенційні проблеми | Так |
| ERROR | Log.e | Критичні помилки та винятки | Так |
| ASSERT | Log.wtf | Помилки, які не повинні відбуватися в принципі | Так |
Тег (tag) — рядок до 23 символів, що ідентифікує джерело повідомлення. Рекомендується використовувати ім'я класу або модуля як тег: MainActivity, AuthManager, NetworkModule. Це дозволяє фільтрувати логи за конкретним компонентом застосунку. Для однаковості в команді можна створити константи тегів в окремому файлі або використовувати бібліотеку Timber, яка автоматично підставляє тег за іменем класу.
При необробленому винятку Android сам записує в Logcat повний stack trace із зазначенням класу, методу, рядка коду та ланцюжка викликів. Crash-лог містить тип винятку (NullPointerException, RuntimeException), повідомлення та послідовність викликів від точки падіння до entry point застосунку. Для аналізу crash-логів з пристроїв користувачів використовується Firebase Crashlytics, який синхронізує stack trace з картою обфускації (mapping.txt для Android).
Android Studio надає графічний інтерфейс Logcat, доступний через View → Tool Windows → Logcat (Alt + 6). Вікно Logcat оновлюється в реальному часі, показує всі повідомлення під'єднаного пристрою та дозволяє налаштовувати гнучкі фільтри для виділення потрібної інформації із загального потоку.
Випадний список Log Level фільтрує повідомлення за мінімальним рівнем: виберіть WARN, щоб бачити лише попередження та помилки, приховавши VERBOSE, DEBUG та INFO. Поле Search дозволяє шукати за текстом повідомлення або тегом — підтримуються regex, що зручно для пошуку повідомлень за патерном.
Saved Filters — потужна функція Logcat в Android Studio. Ви можете створити фільтр, який показує лише повідомлення з тегом вашого застосунку (tag:MyApp) та рівнем WARN+. Фільтри зберігаються між сесіями та доступні з випадного списку. Для проєктів з кількома модулями створіть окремий фільтр на кожен модуль.
# Приклад виразу для фільтрації логів застосунку
tag:"MyApp" level:WARN # Только WARN+ для MyApp
package:"com.mycompany" # Все логи пакета
-tag:"okhttp" # Исключить логи OkHttp
Логи Logcat можна експортувати в текстовий файл через іконку Save to File. Це корисно для прикріплення до тікетів в Jira або аналізу тривалих сесій. Експортований лог можна відкрити в будь-якому текстовому редакторі та застосувати grep для пошуку патернів. Для форматованого перегляду використовуйте утиліту logcat-color.
ADB logcat — консольна версія Logcat, доступна через Android Debug Bridge. Її головна перевага — можливість запуску на CI-серверах, у скриптах автоматизації та на пристроях без Android Studio. ADB logcat підтримує всі ті самі фільтри, що й GUI, але з гнучкістю командного рядка.
Команда adb logcat без аргументів виводить весь буфер у реальному часі. Для зупинки використовуйте Ctrl+C. Прапорець -c очищає буфер перед початком запису — це зручно, коли потрібно ізолювати логи поточного тесту від попередніх повідомлень. Прапорець -b вибирає тип буфера: main, system, events, crash (Android 12+).
# Очистити буфер і запустити запис логів з тегом MyApp
adb logcat -c
adb logcat MyApp:D *:S
# Зберегти логи у файл
adb logcat -d > logcat_dump.txt
# Фільтрація за PID процесу
adb logcat --pid=12345
Комбінація ADB з unix-утилітами дає максимальну гнучкість. Наприклад, фільтр "*:S TAG:D" показує лише повідомлення з тегом TAG рівня DEBUG та вище, приховуючи всі інші. Для перегляду лише Exception використовуйте grep -i exception. Для аналізу частоти помилок застосуйте sort | uniq -c на стовпці тега.
На CI-серверах Logcat використовується для збору діагностики під час прогону UI-тестів. Типовий pipeline: перед запуском тестів очищається буфер, після виконання тестів — дамп логів зберігається як артефакт збірки. Якщо тест упав, за логами можна визначити, чи було падіння викликане ANR, unhandled exception або network timeout.
Клас android.util.Log — вбудований API для запису повідомлень в Logcat. Log.v, Log.d, Log.i, Log.w, Log.e та Log.wtf приймають тег (рядок) і повідомлення (рядок) або повідомлення + Throwable. Для форматування повідомлень використовуйте String.format або Kotlin String templates — уникайте конкатенації рядків, яка створює зайві об'єкти в heap.
Timber — популярна бібліотека Jake Wharton, яка усуває недоліки вбудованого Log API. Timber автоматично підставляє тег за іменем класу, який викликав логування, і не вимагає передачі tag у кожен виклик. Timber також підтримує умовне логування: в Release-збірці виклики Timber.v та Timber.d можна вимкнути одним рядком в Application.onCreate.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Вбудований Log API
Log.d("MainActivity", "onCreate called")
// Timber — автоматичний тег за іменем класу
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")
}
}
}
В Release-збірці рекомендується вимикати VERBOSE та DEBUG логи, щоб знизити навантаження на буфер Logcat та виключити витік чутливої інформації. Timber вирішує це завдання через PlantingTree: в Debug-флаворі саджається DebugTree (логує все), в Release — CrashReportingTree (логує лише ERROR через Crashlytics). Вбудований Log API не підтримує умовне логування — розробнику потрібно обгортати кожен виклик if (BuildConfig.DEBUG).
Часті запитання
Використовуйте команду adb logcat -c перед запуском тесту. Альтернативно в Android Studio натисніть кнопку Clear Logcat (смітник) у вікні Logcat. Очищення не впливає на системні буфери інших процесів, лише на поточне з'єднання.
Виконайте adb logcat -G 2M для збільшення буфера до 2 МБ. Максимальний розмір залежить від пристрою: на Android 10+ доступно до 16 МБ. Зміна зберігається до перезавантаження пристрою. Для постійного налаштування використовуйте build.prop in device tree.
Можливі причини: застосунок запущено в Release-режимі (логи Timber.v/d вимкнені), фільтр Logcat приховує потрібний рівень, або ви під'єднані до неправильного пристрою. Також перевірте, що в Android Studio вибрано процес застосунку, а не system_process.
Знайдіть рядок з FATAL EXCEPTION, під яким іде повний stack trace. Перший рядок містить тип винятку та повідомлення, наступні рядки — ланцюжок викликів із зазначенням файлу та рядка коду. Використовуйте grep "FATAL EXCEPTION" для швидкого пошуку серед усіх логів.
ANR (Application Not Responding) — ситуація, коли головний потік (UI thread) заблоковано більш ніж на 5 секунд. В Logcat ANR виглядає як повідомлення з тегом ActivityManager і текстом "ANR in ..." з прикріпленим stack trace всіх потоків. Використовуйте фільтр tag:ActivityManager level:ERROR.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також