스프링부트에서 로그 파일명을 동적으로 남기고 싶을 때 사용하는 방법
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 를 추가한다.