-
Notifications
You must be signed in to change notification settings - Fork 1
Timber을 적용한 이유
2taezeat edited this page Dec 13, 2023
·
2 revisions
- 작성자 : 2taezeat
- 작성일자 : 23.12.10(일)
Android 개발시 Timber을 적용한 이유
-
Android 개발시 logging 에는
Logcat
을 기본으로 사용한다. -
println
으로도 logging 을 할 수 있지만, 단순 logcat 창에 출력 되는 기능에만 가능하다. -
logger
라는 library 도 있지만, 2018.03 월 release 이후, update가 되지 않고 있다.- https://github.com/orhanobut/logger
-
logger
는 더 pretty 하게 log 출력이 가능하지만,timber
에 비해 좀 더 무겁다.
-
timber
라는 libarary 를 사용하면, 커스텀도 가능하고,Logcat
에 작성해야 하는 "TAG" 도 굳이 작성하지 않아도 자동으로 어느 파일에서 log가 남는지 알 수 있다.-
OkHttp
의HttpLoggingInterceptor
에도 timber를 적용과 Custom이 가능하다. - 그 외에 logging 하는 방법은 기존
Logcat
과 동일하다.Log.d( , )
->Timber.d()
-
-
gradle KTS
을 사용한다고 가정 -
Version Catalog
를 사용한다고 가정
libs.versions.toml
[versions]
timber = "5.0.1" #23.12.10 기준 최신 버전
[libraries]
timber = { module = "com.jakewharton.timber:timber", version.ref = "timber" }
app 모듈의 build.gradle.kts
dependencies {
//...
implementation(libs.timber)
}
Application()
을 상속 받는 .kt 파일에 timber library을 initialize 한다.
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree())
}
}
}
AndroidManifest
파일
<application
android:name=".MainApplication"
android:icon="@mipmap/ic_launcher"
//...
-
createStackElementTag
함수를 override 해서, logging 되는 line, method, class를 logcat에 자동으로 표시할 수 있게 된다.
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) {
Timber.plant(object : Timber.DebugTree() {
override fun createStackElementTag(element: StackTraceElement): String? {
return String.format(
"Class:%s: Line: %s, Method: %s",
super.createStackElementTag(element),
element.lineNumber,
element.methodName
)
}
})
} else {
Timber.plant(ReleaseTree())
}
}
}
ReleaseTree
를 따로 생성하여, release 모드 일때, error report 를 보낼 수 있게 할 수 있다.
class ReleaseTree : @NotNull Timber.Tree() {
override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
if (priority == Log.ERROR || priority == Log.WARN) {
//SEND ERROR REPORTS TO YOUR Crashlytics.
}
}
}
-
No need to write TAGs
- Timber가 자동으로 TAGs 를 생성한다.
-
Customized behavior
- Custom Timber 트리를 사용하여 Logcat에 로깅하는 대신, Crashlytics service로 log를 전송할 수 있다.
-
Customized Meta-Data
-
createStackElementTag
함수를 통해 line, method, class를 logcat에 자동으로 표시할 수 있게 된다.
-
-
Lightweight
- 이미 존재하는 log utility 을 wrapper 한 library 여서 app 용량에 부담을 주지 않는다.
- 참고 : timber version 5.0.0 부터 timber 코드가 java 가 아닌 kotlin 으로 변경되었다.
-
주기적으로 업데이트 되는 open-source
- 2021.08.13 에 5.0.1 버전이 release 되었다.
- 다른 logging 라이브러리(ex.
logger
)에 비해 비교적 최근 까지 업데이트 된다.
-
HttpLoggingInterceptor
사용시,log
함수를 override 하여, debug 모드 일때만, logging 하게 할 수 있다.- Custom 하여, Json을 pretty 하게 출력할 수 도 있다.
@Singleton
@Provides
fun provideLoggingInterceptor(): HttpLoggingInterceptor { // Hilt로 DI를 하는 경우
val logger = HttpLoggingInterceptor.Logger { message -> Timber.tag("okHttp").d(message) }
return HttpLoggingInterceptor(logger)
.setLevel(HttpLoggingInterceptor.Level.BODY)
}
-
Timber.d("")
처럼""
(empty string) 을 logging 하려면, Custom을 해야 한다.
override fun d(message: String?, vararg args: Any?) {
if (message?.length == 0) {
super.d("EMPTY_STRING", *args)
} else {
super.d(message, *args)
}
}
- 프로젝트 생성
- 프로젝트 구조
- PR에 대한 단위 테스트 자동화
- 역/직렬화 라이브러리 비교
- Github Release 자동화
- Firebase App 배포 자동화
- 플러그인을 이용하여 공통 설정 없애기
- Timber 라이브러리를 사용한 이유
- 네트워크 예외 처리
- Kotest 도입기