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 KB за main, 256 KB за system и 256 KB за events (Android 5+). При препълване на буфера старите съобщения се изтриват. Разработчикът може да промени размера на буфера чрез PROP logcat.size или в настройките за разработчици на устройството.
Шест нива на логване определят важността на съобщението. Android използва стандартни нива, подобни на други платформи, но със собствени имена на константи в класа Log. Изборът на правилното ниво помага за ефективно филтриране на логовете и предотвратява удавянето на критични съобщения във второстепенни.
| Ниво | Константа | Предназначение | Показва се по подразбиране |
|---|---|---|---|
| VERBOSE | Log.v | Максимално подробна debug информация | Не |
| DEBUG | Log.d | Debug съобщения за разработчика | Не |
| INFO | Log.i | Информационни съобщения за работата на приложението | Да |
| WARN | Log.w | Предупреждения за потенциални проблеми | Да |
| ERROR | Log.e | Критични грешки и изключения | Да |
| ASSERT | Log.wtf | Грешки, които по принцип не трябва да се случват | Да |
Таг (tag) — низ до 23 знака, идентифициращ източника на съобщението. Препоръчително е да се използва името на класа или модула като таг: MainActivity, AuthManager, NetworkModule. Това позволява филтриране на логовете по конкретен компонент на приложението. За единообразие в екипа могат да се създадат константи за тагове в отделен файл или да се използва библиотеката Timber, която автоматично поставя таг според името на класа.
При необработено изключение Android сам записва в Logcat пълен stack trace с посочване на клас, метод, ред код и верига на извиквания. Логът при срив съдържа типа на изключението (NullPointerException, RuntimeException), съобщението и последователността на извикванията от точката на срива до входната точка на приложението. За анализ на логове при срив от устройства на потребителите се използва 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 тестове. Типичен тръбопровод: преди стартиране на тестовете буферът се изчиства, след изпълнение на тестовете dump на логовете се запазва като артефакт на компилацията. Ако тестът се провали, въз основа на логовете може да се определи дали повредата е причинена от ANR, необработено изключение или мрежов 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 — популярна библиотека на Джейк Уортън, която отстранява недостатъците на вградения Log API. Timber автоматично поставя таг според името на класа, който е извикал логването, и не изисква предаване на таг при всяко извикване. 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 MB. Максималният размер зависи от устройството: на Android 10+ е наличен до 16 MB. Промяната се запазва до рестартиране на устройството. За постоянна конфигурация използвайте build.prop в 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също