질문 정리

효율적인 로깅을 위한 LogUtils

five2week 2024. 1. 23. 16:33

안녕하세요. 오늘은 제가 사용하고 있는 LogUtils에 대해 이야기하고자 합니다. 이 object는 로그를 더 효율적으로 관리하고 디버깅을 용이하게 만들기 위해 정리했습니다.

object LogUtils {
    private const val TAG = "five-two-weeks"
    private val isDebug = BuildConfig.DEBUG_MODE

    fun d(message: String, name : String = TAG) {
        if (isDebug) Log.d(name, createLogMessage(message))
    }

    fun e(message: String, name : String = TAG) {
        if (isDebug) Log.e(name, createLogMessage(message))
    }

    fun i(message: String, name : String = TAG) {
        if (isDebug) Log.i(name, createLogMessage(message))
    }

    fun w(message: String, name : String = TAG) {
        if (isDebug) Log.w(name, createLogMessage(message))
    }

    private fun createLogMessage(message: String): String {
        val stackTraceElement = Throwable().stackTrace[2] // d, e, i, w 메서드 호출자
        return "${stackTraceElement.className} -> ${stackTraceElement.methodName}: $message"
    }
}

LogUtils 클래스의 구조 및 기능

  • 태그 관리: private const val TAG = "five-two-weeks"를 통해 모든 로그 메시지에 기본 태그를 설정합니다. 이 태그는 필요에 따라 변경될 수 있습니다.
  • 디버그 모드 확인: private val isDebug = BuildConfig.DEBUG_MODE는 애플리케이션이 디버그 모드에서 실행되고 있는지 확인합니다. 이를 통해 프로덕션 환경에서 불필요한 로그 출력을 방지합니다.
  • 로그 레벨 메서드: d, e, i, w와 같은 메서드들은 각각 디버그, 에러, 정보, 경고 로그를 출력합니다. 이 메서드들은 필요에 따라 다른 태그로 오버라이드될 수 있습니다.
  • 콜 스택 정보 통합: createLogMessage 메서드는 로그를 호출한 클래스와 메서드의 이름을 로그 메시지에 포함시킵니다. 이는 디버깅 시 문제의 원인을 파악하는 데 도움이 됩니다.

장점

  1. 일관된 로깅: 모든 로그 메시지가 일관된 형식과 태그를 사용합니다. 이는 로그를 추적하고 분석하기 쉽게 만듭니다.
  2. 보안 및 성능 향상: 디버그 모드가 아닐 때 로그를 출력하지 않도록 함으로써, 불필요한 로그로 인한 성능 저하 및 보안 문제를 방지합니다.
  3. 디버깅 용이성: 로그 메시지에 클래스와 메서드 이름을 포함함으로써, 문제의 원인을 빠르게 파악할 수 있습니다.
  4. 중앙집중식 관리: 로깅 관련 코드를 한 곳에서 관리함으로써 유지보수가 용이해집니다.

단점

  1. 오버헤드: Throwable().stackTrace[2]를 사용하여 콜 스택 정보를 가져오는 것은 약간의 성능 오버헤드를 발생시킬 수 있습니다.
  2. 복잡성: 간단한 로그 기능에 비해 상대적으로 더 복잡한 구조를 가지고 있어, 작은 프로젝트나 간단한 애플리케이션에는 과도할 수 있습니다.
  3. 커스터마이징 필요: 프로젝트의 특정 요구사항에 맞게 클래스를 수정해야 할 수도 있습니다.

 

BuildConfig.DEBUG_MODE를 설정하는 방법

추가적으로 BuildConfig.DEBUG_MODE 값을 설정하는 방법은 안드로이드 애플리케이션의 빌드 구성에 따라 다릅니다. 일반적으로, 이 값은 Gradle 빌드 스크립트를 통해 정의되며, 빌드 타입(예: 디버그 또는 릴리즈)에 따라 다르게 설정될 수 있습니다.

 

다음은 BuildConfig.DEBUG_MODE를 설정하는 방법에 대한 기본적인 가이드입니다:

  1. build.gradle 파일 열기: 프로젝트의 app 모듈에 있는 build.gradle 파일을 열어야 합니다.
  2. buildTypes 설정 추가: build.gradle 파일 내에 buildTypes 섹션을 찾거나 새로 만듭니다. 이 섹션 안에서 각 빌드 타입에 대해 BuildConfig 필드를 설정할 수 있습니다.
  3. DEBUG_MODE 값 정의: 디버그와 릴리즈 빌드 타입에 대해 DEBUG_MODE 값을 다르게 설정합니다. 예를 들어, 디버그 모드에서는 true로, 릴리즈 모드에서는 false로 설정할 수 있습니다.
  4. 프로젝트 동기화: 변경 사항을 적용한 후, Android Studio에서 프로젝트를 동기화합니다. 이렇게 하면 BuildConfig 클래스에 DEBUG_MODE 필드가 추가됩니다.
  5. 코드에서 사용: 이제 BuildConfig.DEBUG_MODE를 코드에서 사용하여 현재 빌드가 디버그 모드인지 확인할 수 있습니다.
android {
    ...
    buildTypes {
        debug {
            buildConfigField "boolean", "DEBUG_MODE", "true"
            ...
        }
        release {
            buildConfigField "boolean", "DEBUG_MODE", "false"
            ...
        }
    }
}

 

이렇게 설정하면, 앱의 빌드 타입에 따라 DEBUG_MODE의 값이 자동으로 설정되어, 디버그와 릴리즈 빌드에서 다른 동작을 쉽게 구현할 수 있습니다. 예를 들어, 디버그 빌드에서만 로그를 출력하거나, 테스트 서버에 연결하는 등의 조건부 코드를 작성할 때 유용합니다.