Timber와 Kotlin을 사용한 손쉬운 Android 로깅
Source: Dev.to
Timber가 특별한 이유
- 간결하고 깔끔함 – 반복적인 보일러플레이트를 없애는 간단한 API.
- 자동 태그 생성 – 호출한 클래스 이름을 태그로 사용하므로 더 이상 태그를 직접 코딩할 필요가 없음.
- 커스터마이징 가능한 트리 – 로그가 어디로 가는지 제어 가능(예: 크래시 리포팅 도구, 빌드 타입별 필터링).
- 프로덕션 안전성 – 릴리스 빌드에서는 기본적으로 로그가 비활성화되어 민감한 정보가 누출되는 것을 방지.
Android 앱에 Timber 설정하기
Step 1: 의존성 추가
// app‑level build.gradle
implementation 'com.jakewharton.timber:timber:5.0.1' // 최신 버전을 확인하세요
Step 2: Application 클래스에서 Timber 초기화
앱이 시작될 때 적절한 트리를 심어 주세요.
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree())
} else {
Timber.plant(ReleaseTree()) // 릴리스 빌드용 커스텀 트리
}
}
}
AndroidManifest.xml에 커스텀 Application 클래스를 선언합니다.
Step 3: 코드에서 로깅하기
표준 Log 호출을 Timber 메서드로 교체합니다:
Timber.d("Debug message")
Timber.i("Info message")
Timber.w("Warning message")
Timber.e("Error message: %s", error)
// Kotlin 문자열 템플릿 사용
Timber.d("User id: $userId")
모든 표준 로그 레벨(Verbose, Debug, Info, Warn, Error)이 지원됩니다.
고급 사용법: 커스텀 트리와 확장 함수
커스텀 트리
크래시 리포팅 서비스(예: Firebase Crashlytics, Sentry)로 로그를 라우팅하는 트리를 정의합니다:
class CrashReportingTree : Timber.Tree() {
override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
if (priority >= Log.WARN) {
// 경고/오류를 크래시 리포팅 백엔드에 전송
}
}
}
릴리스 빌드에서는 이 트리를 심어 중요한 로그만 캡처하도록 합니다.
Kotlin 확장 함수
timberkt와 같은 라이브러리는 Kotlin 친화적인 확장 함수를 제공합니다. 람다식은 실제로 로그가 출력될 때만 평가되어 성능을 향상시킵니다:
Timber.d { "User id: $userId, name: ${user.name}" }
Timber를 선택해야 하는 이유
- 태그를 직접 지정할 필요 없음 – 자동 태그 생성으로 시간 절약 및 실수 방지.
- 간편한 정리 – 한 줄만 추가하면 릴리스 빌드에서 로깅이 비활성화되므로
Log.d구문을 일일이 찾아 제거할 필요가 없음. - 동작 커스터마이징 – 프로덕션 환경에서 로그를 외부 서비스로 라우팅해 Logcat을 깔끔하게 유지.
- 풍부한 메타데이터 – 클래스 이름, 라인 번호 등 다양한 정보를 포함해 더 유용한 로그 제공.
마무리 생각
Timber는 단순한 로깅 라이브러리를 넘어 Android 개발 워크플로우를 한층 개선해 주는 도구입니다. 간결한 문법, 자동 태깅, 커스터마이징 가능한 트리를 통해 로깅이 손쉽게 이루어지면서도 완전한 제어와 안전성을 유지할 수 있습니다.
다음에 Log.d("TAG", "Some message")를 사용할 때 Timber를 한 번 시도해 보세요—로그 방식을 영원히 바꿔 놓을지도 모릅니다.
행복한 코딩 되세요!