Log日志追踪之MDC
Springboot使用MDC实现日志追踪
logback-spring.xml配置详细介绍
根节点< configuration>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 其他配置省略-->
</configuration>
- scan : 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
- scanPeriod : 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
- debug : 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
子节点:< property>
<property name="LOG_FILE_PATH" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/logs}"/>
用来定义变量值的标签,< property> 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值,通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。
注:多环境配置下,通过 application.yml 传递参数过来,< property >取不到环境参数,得用< springProperty >。
注:多环境配置下,通过 application.yml 传递参数过来,< property >取不到环境参数,得用< springProperty >。
子节点:< appender>
appender用来格式化日志输出节点,有两个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。
**ConsoleAppender:**就想他的名字一样,将日志信息打印到控制台上,更加准确的说:使用System.out或者System.err方式输出,主要子标签有:encoder,target
**FileAppender:**用于将日志信息输出到文件中,主要子标签有:append,encoder,file
**RollingFileAppender:**从名字我们就可以得出:FileAppender是RollingFileAppender的父类。即RollingFileAppender继承 FIleAppender类。功能:能够动态的创建一个文件。也就是说:到满足一定的条件,就会创建一个新的文 件,然后将日志写入到新的文件中。有两个重要的标签与rolingFileAppender进行交互:RollingPolicy,TriggeringPolicy,主要子标签:file,append,encoder,rollingPolicy,triggerPolicy
logback



上图修正 5-应为-5




import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.core.task.TaskDecorator;
import java.util.Map;
@Slf4j
public class MdcTaskDecorator implements TaskDecorator {
@Override
public Runnable decorate(Runnable runnable) {
Map<String, String> contextMap = MDC.getCopyOfContextMap();
String trace = MDC.get("tid");
return () -> {
try {
if (contextMap != null) {
MDC.setContextMap(contextMap);
MDC.put("tid",trace);
}
runnable.run();
} finally {
MDC.clear();
}
};
}
}
@Configuration
@EnableAsync
public class AsycnThreadPoolConfig {
@Bean(name = "asycnThreadPoolTaskExecutor")
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 设置核心线程数
executor.setCorePoolSize(8);
// 设置最大线程数
executor.setMaxPoolSize(8);
// 设置队列容量
executor.setQueueCapacity(20);
// 设置线程活跃时间(秒)
executor.setKeepAliveSeconds(120);
// 设置默认线程名称
executor.setThreadNamePrefix("async-");
// 设置拒绝策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 等待所有任务结束后再关闭线程池
executor.setWaitForTasksToCompleteOnShutdown(true);
//!!!!!!就是这!!!!!
executor.setTaskDecorator(new MdcTaskDecorator());
return executor;
}
}
