需求:有一个调度平台,需要将每一次调度单独生成日志文件,方便后续维护以及问题定位
环境:springboot + logback
logback.xml内容
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->
<property name="LOG_HOME" value="d:/log" />
<appender name="TASK-LOG" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>taskid-and-session</key>
<defaultValue>unknown</defaultValue>
</discriminator>
<sift>
<appender name="${taskid-and-session}" class="ch.qos.logback.core.FileAppender">
<file>${LOG_HOME}/byUser/${taskid-and-session}.log</file>
<append>false</append>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
</sift>
</appender>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="TASK-LOG"/>
</root>
</configuration>
其中
appender 用 ch.qos.logback.classic.sift.SiftingAppender
在里面嵌套 appender,这里使用的是 ch.qos.logback.core.FileAppender
${taskid-and-session} 是通过MDC put进去的
样例代码:
package com.zhao;
import static ch.qos.logback.classic.ClassicConstants.FINALIZE_SESSION_MARKER;
import java.util.UUID;
import org.jboss.logging.MDC;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import lombok.extern.slf4j.Slf4j;
@SpringBootApplication
@Slf4j
public class LogbackDemoApplication {
public static final String TASKID_AND_SESSION = "taskid-and-session";
public static void main(String[] args) throws InterruptedException {
SpringApplication.run(LogbackDemoApplication.class, args);
for(int i = 0 ; i < 10 ; i++) {
String jobId = "jobId";
MDC.put(TASKID_AND_SESSION, (jobId + UUID.randomUUID().toString()).replace("-", ""));
log.info("info 日志");
//主动让SiftingAppender结束文件.
log.info(FINALIZE_SESSION_MARKER,"close sifting Appender of `{}`", MDC.get(TASKID_AND_SESSION));
//清理MDC.
MDC.clear();
System.out.println("第"+(i+1)+"次完成");
}
}
}
最后要固定输入一个
log.info(FINALIZE_SESSION_MARKER,"close sifting Appender of `{}`", MDC.get(TASKID_AND_SESSION));
然后将MDC清空,此次输出结束
//清理MDC.
MDC.clear();
生成的日志文件目录为