TIL240417 debug logging

jericho·2024년 4월 17일

TIL

목록 보기
52/62

개발을 하다보면 확인을 위한 로그나 에러 상황 체크를 위한 로그 등 수많은 로그를 찍게 된다. 하지만 이 로그 중 대다수는 릴리즈에서는 필요가 없고, 오히려 내부 정보를 노출하게 된다. 그렇다고 배포 버전마다 일일이 로그를 모두 지우기도 힘들고, 놓치는 로그도 있을 것이다. 어떻게 하면 디버그 모드에서만 로그를 찍을 수 있을까?

해답은, 디버그 모드인지 확인하고 로그를 찍으면 된다.
... 너무 단순했나? 하지만 때로는 단순한 게 답이다.
BuildConfig.DEBUG 를 통해 디버그 모드인지 여부를 알 수 있다.

if (BuildConfig.DEBUG) Log.d(tag, msg)

하지만 모든 로그에 또 일일이 if 분기를 만들어주는 것도 매우 귀찮은 일이다.
이를 위해, if문을 합친 로그 오브젝트를 만든다.
(처음에는 Log의 확장함수로 만들려고 했으나, Log에는 확장함수를 만들 수 없었다. 하지만 덕분에 더 간단한 형태로 만들 수 있었다.)

Log 앞에 디버그를 의미하는 D를 붙이고, 나머지는 Log와 완전히 동일하게 사용할 수 있도록 만들었다. 기존의 로그 코드의 맨 앞에 D만 붙이면 된다.
이로써 릴리즈에서의 불필요한 로깅으로 인한 성능 저하 및 정보 유출을 막을 수 있게 되었다.
(if 분기 한 개까지 없애려면 코드 자체를 지워야겠지만, 이러한 마이크로 최적화는 비용 대비 효율이 굉장히 나쁘다...)

// 전체 코드
object DLog {
    private val debug = BuildConfig.DEBUG

    fun d(tag: String?, msg: String) {
        if (debug) Log.d(tag, msg)
    }

    fun d(tag: String?, msg: String?, tr: Throwable?) {
        if (debug) Log.d(tag, msg, tr)
    }

    fun v(tag: String?, msg: String) {
        if (debug) Log.v(tag, msg)
    }

    fun v(tag: String?, msg: String?, tr: Throwable?) {
        if (debug) Log.v(tag, msg, tr)
    }

    fun i(tag: String?, msg: String) {
        if (debug) Log.i(tag, msg)
    }

    fun i(tag: String?, msg: String?, tr: Throwable?) {
        if (debug) Log.i(tag, msg, tr)
    }

    fun e(tag: String?, msg: String) {
        if (debug) Log.e(tag, msg)
    }

    fun e(tag: String?, msg: String?, tr: Throwable?) {
        if (debug) Log.e(tag, msg, tr)
    }

    fun w(tag: String?, msg: String) {
        if (debug) Log.w(tag, msg)
    }

    fun w(tag: String?, tr: Throwable?) {
        if (debug) Log.w(tag, tr)
    }

    fun w(tag: String?, msg: String?, tr: Throwable?) {
        if (debug) Log.w(tag, msg, tr)
    }

}

TIL을 쓰다보니, 함수들을 람다식으로 만들고 init에서 debug를 확인해서 디버그일 때에만 로그식을 넣어주고 릴리즈에서는 Unit을 넣으면 if 분기를 없애서 성능이 향상되지 않을까 하는 생각이 든다. (하지만 역시 성능 개선이 미미할테니 그냥 무시하도록 하자)

3개의 댓글

comment-user-thumbnail
2024년 4월 23일

재밌다

1개의 답글