Logback 사용법 정리

4rk·2025년 2월 12일

Logback이란?

Logback은 오픈소스 로깅 프레임워크이며 SLF4J의 구현체로, 스프링 부트에서 기본으로 내장되어 있는 로깅 라이브러리이다. Log4j보다 성능이 뛰어나며, 일반적으로 Log4j2와 Logback 중 선택하여 사용한다.

Log4j2는 멀티쓰레드 환경에서 비동기 처리가 뛰어나지만 이번 글에서는 스프링 부트 기본으로 제공하는 Logback에 대해서 알아보려고 한다.

SLF4J

SLF4J는 다양한 로깅 라이브러리를 하나의 통일된 방식으로 사용할 수 있도록 하는 추상 레이어를 제공한다. 이를 통해 애플리케이션은 특정 로깅 라이브러리에 종속되지 않고, 필요에 따라 쉽게 교체할 수 있다.

Logback 설정하기

Logback은 SLF4J의 구현체 중 하나로, 다양한 방식으로 설정할 수 있다.

Appender

Appender는 로그를 출력할 위치와 형식을 지정하는 역할을 한다.

  • ConsoleAppender: 콘솔에 로그를 출력하는 설정
  • FileAppender: 파일에 로그를 저장하는 설정
  • RollingFileAppender: 일정 크기 이상의 로그 파일을 자동으로 관리하는 설정

로그 레벨 및 Logger

로그 레벨은 다음과 같이 구분된다.
1. ERROR
2. WARN
3. INFO
4. DEBUG
5. TRACE

Logger는 로그를 기록하는 개체로, 특정 패키지 또는 클래스를 기준으로 설정할 수 있다. 최상위 Logger인 Root Logger를 설정하면, 계층적으로 하위 패키지에도 적용된다.

개발 과정에서는 DEBUG 이하 레벨을 주로 사용하며, INFO 레벨은 일반적인 운영 환경에서 사용된다. ERROR 레벨은 치명적인 오류 발생 시 기록된다.

로그 관리 전략

  • 환경별 로그 레벨 설정: 개발 환경에서는 DEBUG, 운영 환경에서는 INFO 또는 WARN 레벨을 사용하여 불필요한 로그를 줄인다.
  • 구조화된 로깅(JSON 포맷 활용): JSON 기반 로그를 사용하면 로그 분석 및 검색이 용이하다.
  • 로그 파일 회전 설정: RollingFileAppender를 활용하여 로그 파일이 일정 크기를 넘으면 자동으로 새로운 파일을 생성하도록 설정한다.
  • 로그 수집 및 모니터링: ELK(Stack) 또는 Grafana Loki와 연동하여 로그를 중앙에서 수집하고 모니터링한다.

Logback 활용 사례

1. 마이크로서비스 환경에서의 Logback 적용

  • 각 마이크로서비스에서 공통적인 로깅 패턴을 적용하여 관리
  • 중앙 집중식 로그 수집 시스템(예: ELK, Prometheus + Loki)과 연동
  • JSON 기반 로그 포맷을 사용하여 로그를 쉽게 분석 가능

2. 클라우드 및 Kubernetes 환경에서의 Logback 적용

  • 로그를 표준 출력(stdout)으로 전송하여 Kubernetes 로그 관리 시스템과 연동
  • logback-spring.xml에서 환경별 로그 설정을 적용하여 동적인 구성 가능
  • Promtail과 Loki를 활용하여 로그를 실시간으로 모니터링

3. ELK Stack과의 연동

  • Logback에서 JSON 형식의 로그를 생성하여 Logstash에서 수집 및 변환
  • Elasticsearch에 로그를 저장하고, Kibana에서 시각화하여 모니터링
  • logback.xml에서 Kafka Appender를 설정하여 대규모 로그 처리 가능

Logback 설정 방법

Logback은 XML 또는 Kotlin 코드로 설정할 수 있다.

logback.xml vs logback-spring.xml

스프링 부트에서는 logback-spring.xml을 사용하는 것이 권장된다.

설정 파일설명
logback.xml일반적인 Logback 설정 파일로, Spring Boot의 확장 기능을 활용할 수 없음
logback-spring.xmlSpring Boot에서 동적으로 프로파일을 변경할 수 있도록 지원

logback-spring.xml을 사용하면, Spring의 설정과 연동 가능

  • Spring의 @Profile을 활용하여 환경별로 다른 로깅 설정을 적용할 수 있음
  • 예제:
<springProfile name="dev">
    <logger name="com.example" level="DEBUG"/>
</springProfile>
<springProfile name="prod">
    <logger name="com.example" level="ERROR"/>
</springProfile>

XML 방식 설정 예제

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />

    <!-- Console Appender 설정 -->
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="Console"/>
    </root>
</configuration>

Kotlin 방식

Kotlin 코드로 Logback을 설정할 수도 있다.

@Configuration
class LogBackConfig {
    private val logCtx: LoggerContext = LoggerFactory.getILoggerFactory() as LoggerContext
    private val pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS} %magenta([%thread]) %highlight([%-3level]) %logger{5} - %msg %n"

    private lateinit var consoleAppender: ConsoleAppender<ILoggingEvent>

    @Bean
    fun logConfig() {
        consoleAppender = getLogConsoleAppender()
        createLoggers()
    }

    private fun createLogger(loggerName: String, logLevel: Level, additive: Boolean) {
        val logger = logCtx.getLogger(loggerName)
        logger.isAdditive = additive
        logger.level = logLevel
        logger.addAppender(consoleAppender)
    }

    private fun createLoggers() {
        createLogger("root", Level.INFO, true)
    }

    private fun getLogConsoleAppender(): ConsoleAppender<ILoggingEvent> {
        val appenderName = "STDOUT"
        val consoleLogEncoder = createLogEncoder(pattern)
        return createLogConsoleAppender(appenderName, consoleLogEncoder)
    }

    private fun createLogEncoder(pattern: String): PatternLayoutEncoder {
        return PatternLayoutEncoder().apply {
            context = logCtx
            this.pattern = pattern
            start()
        }
    }

    private fun createLogConsoleAppender(appenderName: String, consoleLogEncoder: PatternLayoutEncoder): ConsoleAppender<ILoggingEvent> {
        return ConsoleAppender<ILoggingEvent>().apply {
            name = appenderName
            context = logCtx
            encoder = consoleLogEncoder
            start()
        }
    }
}

이 클래스는 Logback 설정을 Kotlin 코드로 구성하는 방법을 보여준다. 로거에 로깅 레벨을 지정하고, 인코더에 패턴을 설정한 후 빈으로 등록하여 사용한다.

profile
4rk의 프로그래밍 스터디

0개의 댓글