Logback은 오픈소스 로깅 프레임워크이며 SLF4J의 구현체로, 스프링 부트에서 기본으로 내장되어 있는 로깅 라이브러리이다. Log4j보다 성능이 뛰어나며, 일반적으로 Log4j2와 Logback 중 선택하여 사용한다.
Log4j2는 멀티쓰레드 환경에서 비동기 처리가 뛰어나지만 이번 글에서는 스프링 부트 기본으로 제공하는 Logback에 대해서 알아보려고 한다.
SLF4J는 다양한 로깅 라이브러리를 하나의 통일된 방식으로 사용할 수 있도록 하는 추상 레이어를 제공한다. 이를 통해 애플리케이션은 특정 로깅 라이브러리에 종속되지 않고, 필요에 따라 쉽게 교체할 수 있다.
Logback은 SLF4J의 구현체 중 하나로, 다양한 방식으로 설정할 수 있다.
Appender는 로그를 출력할 위치와 형식을 지정하는 역할을 한다.
로그 레벨은 다음과 같이 구분된다.
1. ERROR
2. WARN
3. INFO
4. DEBUG
5. TRACE
Logger는 로그를 기록하는 개체로, 특정 패키지 또는 클래스를 기준으로 설정할 수 있다. 최상위 Logger인 Root Logger를 설정하면, 계층적으로 하위 패키지에도 적용된다.
개발 과정에서는 DEBUG 이하 레벨을 주로 사용하며, INFO 레벨은 일반적인 운영 환경에서 사용된다. ERROR 레벨은 치명적인 오류 발생 시 기록된다.
RollingFileAppender를 활용하여 로그 파일이 일정 크기를 넘으면 자동으로 새로운 파일을 생성하도록 설정한다.logback-spring.xml에서 환경별 로그 설정을 적용하여 동적인 구성 가능logback.xml에서 Kafka Appender를 설정하여 대규모 로그 처리 가능Logback은 XML 또는 Kotlin 코드로 설정할 수 있다.
스프링 부트에서는 logback-spring.xml을 사용하는 것이 권장된다.
| 설정 파일 | 설명 |
|---|---|
logback.xml | 일반적인 Logback 설정 파일로, Spring Boot의 확장 기능을 활용할 수 없음 |
logback-spring.xml | Spring Boot에서 동적으로 프로파일을 변경할 수 있도록 지원 |
✅ logback-spring.xml을 사용하면, Spring의 설정과 연동 가능
@Profile을 활용하여 환경별로 다른 로깅 설정을 적용할 수 있음<springProfile name="dev">
<logger name="com.example" level="DEBUG"/>
</springProfile>
<springProfile name="prod">
<logger name="com.example" level="ERROR"/>
</springProfile>
<?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 코드로 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 코드로 구성하는 방법을 보여준다. 로거에 로깅 레벨을 지정하고, 인코더에 패턴을 설정한 후 빈으로 등록하여 사용한다.