基于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>
相关推荐
独好紫罗兰4 分钟前
洛谷题单3-P5720 【深基4.例4】一尺之棰-python-流程图重构
开发语言·python·算法
suimeng65 分钟前
ChromeDriver的常用方法
java·selenium
byte轻骑兵18 分钟前
【C++进阶】关联容器:pair类型
开发语言·c++
Hellyc21 分钟前
SpringMVC响应数据:页面跳转与回写数据
java·前端·学习
LuckyRich129 分钟前
【boost搜索引擎】下
开发语言·c++·搜索引擎
嘵奇35 分钟前
深入解析 Spring Boot 测试核心注解
java·spring boot·后端
癞皮狗不赖皮39 分钟前
Java安全基础-反射机制
java·反射机制·java安全基础
别惊鹊1 小时前
(三)安装和使用Maven
java·maven
兢兢业业的小白鼠1 小时前
Java高级JVM知识点记录,内存结构,垃圾回收,类文件结构,类加载器
java·开发语言·jvm·tomcat
Niuguangshuo1 小时前
Python设计模式:代理模式
开发语言·python·代理模式