Slf4j

Log日志追踪之MDC
在这里插入图片描述
Springboot使用MDC实现日志追踪

logback-spring.xml配置详细介绍

根节点< configuration>

<configuration scan="true" scanPeriod="60 seconds" debug="false">  
    <!-- 其他配置省略-->  
</configuration>
  1. scan : 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
  2. scanPeriod : 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
  3. 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
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

子线程如何获取父线程ThreadLocal的值

分布式链路追踪
在这里插入图片描述
线程池获取主线程的traceid

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;
    }
}

InheritableThreadLocal——父线程传递本地变量到子线程的解决方式及分析


版权声明:本文为Alice_whj原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。