问题:使用多线程的时候日志收集只能收集到主线程的,子线程的日志收集不到。
解决:创建多线程的时候使用org.slf4j.MDC把主线程的信息映射到子线程
package com.wechat.util;
import cn.hutool.core.net.NetUtil;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.Map;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* @author 80123389
* @date 2023/10/26 19:29
* @DESCRIPTION
*/
@Slf4j
@Configuration
public class ExecutorUtil {
@Value("${spring.task.concurrency:3}")
private int concurrency;
@Bean("wechatTaskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 设置核心线程数
executor.setCorePoolSize(this.concurrency);
// 设置最大线程数
executor.setMaxPoolSize(this.concurrency);
// 设置队列容量
executor.setQueueCapacity(1000);
// 设置线程存活时间(单位:秒)
executor.setKeepAliveSeconds(60);
// 设置线程名前缀
executor.setThreadNamePrefix("task" + NetUtil.getLocalhostStr() + "-");
// 设置拒绝策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 注入MDC
executor.setTaskDecorator(runnable -> {
Map<String, String> contextMap = MDC.getCopyOfContextMap();
return () -> {
try {
if (contextMap != null) {
MDC.setContextMap(contextMap);
}
runnable.run();
} finally {
MDC.clear();
}
};
});
//初始化
executor.initialize();
return executor;
}
}