PHpullh
학습 라이브러리/Kotlin/로깅 전략 (Logging Strategy)

KOTLIN · 예외처리

로깅 전략 (Logging Strategy)

구조화된 로깅으로 에러 추적을 효율화합니다. 로그 레벨과 컨텍스트 정보를 체계적으로 관리합니다.

예외처리중급logginglog-levelstructured-loggingerror-tracking

핵심 설명

구조화된 로깅으로 에러 추적을 효율화합니다. 로그 레벨과 컨텍스트 정보를 체계적으로 관리합니다.

Kotlin code

enum class LogLevel { DEBUG, INFO, WARN, ERROR }

class Logger(private val tag: String) {
    private var minLevel = LogLevel.DEBUG

    fun setLevel(level: LogLevel) { minLevel = level }

    private fun log(level: LogLevel, message: String, error: Throwable? = null) {
        if (level.ordinal < minLevel.ordinal) return
        val time = java.time.LocalDateTime.now().toString().take(19)
        val entry = "[$time][${level.name}][$tag] $message"
        println(entry)
        error?.let { println("  원인: ${it.message}") }
    }

    fun debug(message: String) = log(LogLevel.DEBUG, message)
    fun info(message: String) = log(LogLevel.INFO, message)
    fun warn(message: String, e: Throwable? = null) = log(LogLevel.WARN, message, e)
    fun error(message: String, e: Throwable) = log(LogLevel.ERROR, message, e)

    // 구조화된 컨텍스트
    fun withContext(vararg pairs: Pair<String, Any>): String =
        pairs.joinToString(", ") { "${it.first}=${it.second}" }
}

fun main() {
    val log = Logger("UserService")
    log.info("서비스 시작")
    log.debug("설정 로드 완료")

    try {
        throw RuntimeException("DB 연결 실패")
    } catch (e: Exception) {
        log.error(
            "사용자 조회 실패 - ${log.withContext("userId" to "U001", "retry" to 3)}",
            e
        )
    }
}

학습 팁

로그 메시지에 관련 컨텍스트(ID, 파라미터, 재시도 횟수 등)를 포함하면 문제 추적이 훨씬 쉬워집니다.

주의할 점

ERROR 레벨에서 스택 트레이스 없이 메시지만 남기면 원인 추적이 어렵습니다. 예외 객체를 항상 함께 전달하세요.

자주 묻는 질문

로깅 전략 (Logging Strategy)란 무엇인가요?

구조화된 로깅으로 에러 추적을 효율화합니다. 로그 레벨과 컨텍스트 정보를 체계적으로 관리합니다.

로깅 전략 (Logging Strategy) 학습 시 주의할 점은 무엇인가요?

ERROR 레벨에서 스택 트레이스 없이 메시지만 남기면 원인 추적이 어렵습니다. 예외 객체를 항상 함께 전달하세요.