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 са навођењем класе, метода, линије кода и ланца позива. Crash лог садржи тип изузетка (NullPointerException, RuntimeException), поруку и след позива од тачке пада до улазне тачке апликације. За анализу 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 тестова. Типичан цевовод: пре покретања тестова бафер се чисти, након извршења тестова — дамп логова се чува као артефакт изградње. Ако тест није успео, на основу логова се може утврдити да ли је пад проузрокован 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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође