본문으로 바로가기

[Springboot] SLF4j logback 로그 파일명 동적으로 변경하기

category Spring 2024. 5. 5. 23:02

스프링부트에서 로그 파일명을 동적으로 남기고 싶을 때 사용하는 방법

 

ex. 사용자 이름별로 로그를 남기고 싶을 때.

홍길동.log

이순신.log

심청이.log 

 

 

자바 설정

@Slf4j
public class LogShiftTestApplication implements CommandLineRunner {

    private final Logger logger = LoggerFactory.getLogger(LogShiftTestApplication.class);
    
    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(LogShiftTestApplication.class);
        application.run(args);
    }
    
    public void run(String... args) throws Exception {
        String[] students = {"홍길동", "이순신", "심청이"};
        
        for(String student : students){
    		MDC.put("STUDENT_NAME", student);
        	logger.info("START PROCESS : [" + student + "]");        
        }
    }
    
}

 

 

logback.xml 설정

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">
	<property name="LOGS_PATH" value="./logs" />
	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<withJansi>true</withJansi>
		<encoder>
			<pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %green(%-5level) %logger{35} %cyan(%logger{15}) - %msg %n</pattern>
		</encoder>
	</appender>
	<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender"> 
		<discriminator>
			<key>STUDENT_NAME</key>
			<defaultValue>unknown</defaultValue>
		</discriminator>
		<sift>
			<appender name="DAILY_ROLLING_FILE_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
				<file>${LOGS_PATH}/${STUDENT_NAME}.log</file>
				<encoder>
					<pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level%logger{35} - %msg%n</pattern>
				</encoder>
			</appender>
		</sift>
	</appender>

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

 

1. 자바 코드에서 MDC를 사용하여 변수를 put 한다.

2. SiftingAppender 를 사용하여 기존 사용하던 log appender 를 감싸준다.

3. discriminator에 MDC에 담은 변수를 설정한다.

3. 파일명을 ${STUDENT_NAME}.log 로 설정한다.

4. 제일 아래 level 설정에 SIFT appender 를 추가한다.