基于log4j的自定义traceid实现

思路就是spring 做切面拦截请求,切面入口时生成traceId,然后放到MDC里面(就是threadLocal,MDC是log框架提供的工具类,能方便在配置文件里面引用插入的值)。 切面结束时traceId。

java 复制代码
import com.sing.monitor.api.CloudWatchApi;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.UUID;

/**
 * 生成traceId用的
 */
@Component
@Slf4j
public class TraceIDFilter extends OncePerRequestFilter {

    @Autowired
    private CloudWatchApi cloudWatchApi;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        try {
            try{
                String traceId = MDC.get("traceId");
                if(traceId == null){
                    traceId = UUID.randomUUID().toString().substring(0, 8);
                    MDC.put("traceId", traceId);
                }
            }catch (Exception e){
                log.error("generate traceId error", e);
            }
            filterChain.doFilter(request, response);
        } finally {
            try{
                MDC.remove("traceId");
            }catch (Exception e){
                log.error("remove traceId from MDC error", e);
            }

        }
    }
}
XML 复制代码
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.11</version> <!-- 确保选择适合你项目的版本 -->
        </dependency>
XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>

    <property name="LOG_HOME" value="/data/wwwroot/backend/logs"/>
    <property name="FILE_NAME" value="web-capi"/>

    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%logger.java:%line][%X{traceId}] - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="TraceIdRollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/${FILE_NAME}.log</file>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天生成一个新的日志文件 -->
            <fileNamePattern>${LOG_HOME}/${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz</fileNamePattern>
            <!-- 保留30天的日志 -->
            <maxHistory>30</maxHistory>
            <!-- 当日志文件大小超过10MB时,开始滚动 -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <encoder>
            <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%logger.java:%line][%X{traceId}] - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="TraceIdRollingFileAppender" />
        <appender-ref ref="Console" />
    </root>
</Configuration>
相关推荐
安全系统学习1 分钟前
【网络安全】Qt免杀样本分析
java·网络·安全·web安全·系统安全
luojiaao24 分钟前
【Python工具开发】k3q_arxml 简单但是非常好用的arxml编辑器,可以称为arxml杀手包
开发语言·python·编辑器
终焉代码24 分钟前
STL解析——list的使用
开发语言·c++
SoFlu软件机器人27 分钟前
智能生成完整 Java 后端架构,告别手动编写 ControllerServiceDao
java·开发语言·架构
英英_34 分钟前
视频爬虫的Python库
开发语言·python·音视频
猛犸MAMMOTH39 分钟前
Python打卡第46天
开发语言·python·机器学习
多多*1 小时前
微服务网关SpringCloudGateway+SaToken鉴权
linux·开发语言·redis·python·sql·log4j·bootstrap
梓仁沐白1 小时前
【Kotlin】协程
开发语言·python·kotlin
写bug写bug1 小时前
如何正确地对接口进行防御式编程
java·后端·代码规范