Logcat은 ADB 또는 Android Studio의 내장 콘솔을 통해 사용할 수 있는, 실시간으로 시스템 메시지와 애플리케이션 로그를 보기 위한 Android SDK 도구입니다. Android Developers에 따르면 Logcat은 시스템의 모든 프로세스에서 메시지를 수집하고, 중요도 레벨과 태그별로 필터링하며, 개발자가 오류를 진단하고 코드 실행을 추적하며 성능을 분석할 수 있게 합니다. Logcat은 Android 애플리케이션을 디버깅할 때 주요 정보 소스입니다.
주요 포인트
Logcat은 모든 프로세스(Linux 커널, system_server 및 애플리케이션 포함)가 특정 형식으로 메시지를 쓰는 Android 시스템 버퍼입니다. Android SDK에 포함된 logcat 도구는 이 버퍼를 읽고 실시간으로 메시지를 표시합니다. Android 4.1(API 16)부터 Logcat 접근이 제한됩니다: 애플리케이션은 자신의 로그만 읽을 수 있으며, 시스템 로그는 디버그 액세스가 있는 ADB를 통해 접근 가능합니다.
각 Logcat 메시지에는 다섯 개의 필드가 있습니다: 날짜와 시간, PID(프로세스 식별자), TID(스레드 식별자), 로그 레벨 및 태그입니다. 형식은 고정되어 있으며 모든 Android 버전에서 동일합니다. 이를 통해 IDE에 의존하지 않고 CI/CD 파이프라인에서 로그 필터링에 grep, awk 및 sed 유틸리티를 사용할 수 있습니다.
로그는 고정 크기의 링 버퍼에 저장됩니다: main용 256KB, system용 256KB, events용 256KB(Android 5+). 버퍼가 오버플로우되면 이전 메시지가 삭제됩니다. 개발자는 PROP logcat.size 속성이나 기기의 개발자 옵션에서 버퍼 크기를 변경할 수 있습니다.
6가지 레벨의 로깅이 메시지의 중요도를 결정합니다. 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에 전체 스택 트레이스를 기록하며, 클래스, 메서드, 코드 라인 및 호출 체인을 표시합니다. 크래시 로그에는 예외 유형(NullPointerException, RuntimeException), 메시지 및 크래시 지점에서 애플리케이션의 진입점까지의 호출 시퀀스가 포함됩니다. 사용자 기기의 크래시 로그 분석에는 Firebase Crashlytics가 사용되며, 난독화 맵(Android용 mapping.txt)과 스택 트레이스를 동기화합니다.
Android Studio는 View → Tool Windows → Logcat(Alt + 6)을 통해 접근 가능한 그래픽 Logcat 인터페이스를 제공합니다. Logcat 창은 실시간으로 업데이트되며, 연결된 기기의 모든 메시지를 표시하고 일반 스트림에서 원하는 정보를 분리하기 위한 유연한 필터를 구성할 수 있습니다.
Log Level 드롭다운은 최소 레벨별로 메시지를 필터링합니다: WARN을 선택하면 VERBOSE, DEBUG, INFO를 숨기고 경고와 오류만 표시합니다. 검색 필드는 메시지 텍스트 또는 태그로 검색할 수 있으며 — 정규식을 지원하여 패턴별 메시지 검색에 편리합니다.
Saved Filters는 Android Studio에서 Logcat의 강력한 기능입니다. 애플리케이션의 태그(tag:MyApp)와 WARN+ 레벨의 메시지만 표시하는 필터를 만들 수 있습니다. 필터는 세션 간에 유지되며 드롭다운 목록에서 사용할 수 있습니다. 여러 모듈이 있는 프로젝트의 경우 각 모듈에 대해 별도의 필터를 만드세요.
# 애플리케이션 로그 필터링을 위한 표현식 예
tag:"MyApp" level:WARN # MyApp의 WARN+만
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 레벨 이상의 메시지만 표시하고 나머지는 모두 숨깁니다. 예외만 보려면 grep -i exception을 사용하세요. 오류 빈도를 분석하려면 태그 열에 sort | uniq -c를 적용하세요.
CI 서버에서는 UI 테스트 실행 중 진단 정보 수집에 Logcat이 사용됩니다. 일반적인 파이프라인: 테스트 실행 전에 버퍼를 지우고, 테스트 실행 후 로그 덤프를 빌드 아티팩트로 저장합니다. 테스트가 실패하면 로그를 통해 실패가 ANR, 처리되지 않은 예외 또는 네트워크 타임아웃으로 인한 것인지 확인할 수 있습니다.
android.util.Log 클래스는 Logcat에 메시지를 쓰기 위한 내장 API입니다. Log.v, Log.d, Log.i, Log.w, Log.e 및 Log.wtf는 태그(문자열)와 메시지(문자열) 또는 메시지 + Throwable을 받습니다. 메시지 형식 지정에는 String.format 또는 Kotlin 문자열 템플릿을 사용하세요 — 힙에 불필요한 객체를 생성하는 문자열 연결은 피하세요.
Timber는 Jake Wharton의 인기 라이브러리로, 내장 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 빌드에서는 Logcat 버퍼 부하를 줄이고 민감한 정보 유출을 방지하기 위해 VERBOSE 및 DEBUG 로그를 비활성화하는 것이 좋습니다. Timber는 PlantingTree를 통해 이 문제를 해결합니다: Debug 플레이버에서는 DebugTree를 심고(모두 로깅), Release에서는 CrashReportingTree를 심습니다(Crashlytics를 통해 ERROR만 로깅). 내장 Log API는 조건부 로깅을 지원하지 않으므로 개발자는 각 호출을 if (BuildConfig.DEBUG)로 감싸야 합니다.
자주 묻는 질문
테스트 실행 전에 adb logcat -c 명령어를 사용하세요. 또는 Android Studio의 Logcat 창에서 Clear Logcat 버튼(휴지통)을 클릭하세요. 지우기는 다른 프로세스의 시스템 버퍼에 영향을 주지 않으며 현재 연결에만 영향을 줍니다.
버퍼를 2MB로 늘리려면 adb logcat -G 2M을 실행하세요. 최대 크기는 기기에 따라 다릅니다: Android 10+에서는 최대 16MB까지 사용 가능합니다. 변경 사항은 기기가 재부팅될 때까지 유지됩니다. 영구 설정을 위해 device tree의 build.prop을 사용하세요.
가능한 원인: 애플리케이션이 Release 모드로 실행 중임(Timber.v/d 로그 비활성화), Logcat 필터가 필요한 레벨을 숨기고 있음, 또는 잘못된 기기에 연결됨. 또한 Android Studio에서 애플리케이션의 프로세스를 선택했는지 확인하세요(system_process가 아님).
FATAL EXCEPTION이 있는 줄을 찾으세요. 그 아래에 전체 스택 트레이스가 있습니다. 첫 번째 줄에는 예외 유형과 메시지가 포함되고, 이후 줄에는 파일 및 코드 라인 정보가 있는 호출 체인이 포함됩니다. 모든 로그 중에서 빠르게 검색하려면 grep "FATAL EXCEPTION"을 사용하세요.
ANR(Application Not Responding)은 메인 스레드(UI 스레드)가 5초 이상 차단되는 상황입니다. Logcat에서 ANR은 ActivityManager 태그와 "ANR in ..." 텍스트가 있는 메시지로 나타나며 모든 스레드의 스택 트레이스가 첨부됩니다. 필터 tag:ActivityManager level:ERROR을 사용하세요.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.