基于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>
相关推荐
longxibo几秒前
【第1章 环境搭建与项目结构解析】
java·后端·流程图
鸟儿不吃草1 分钟前
安卓实现左右布局聊天界面
android·开发语言·python
a***72892 分钟前
Java进阶(ElasticSearch的安装与使用)
java·elasticsearch·jenkins
Java成神之路-6 分钟前
面试题:Spring AOP底层实现原理
java·spring aop
Python私教9 分钟前
如意Agent日志系统重构:从 print() 大海捞针到结构化可观测性栈
java·前端·重构
jieyucx14 分钟前
Go 零基础数据结构:顺序表(像「排抽屉」一样学增删改查)
java·数据结构·golang
曦夜日长15 分钟前
C++ STL容器string(一):string的变量细节、默认函数的认识以及常用接口的使用
java·开发语言·c++
代码中介商17 分钟前
C++ STL 标准模板库完全指南:从容器到迭代器
开发语言·c++·stl
winner888120 分钟前
C++ 构造函数、析构函数、虚函数、虚析构
开发语言·c++
北山有鸟22 分钟前
IS_ERR 判断出错后,再用 PTR_ERR 把它强制转换回 int 型的错误码作为函数的返回值。
java·开发语言