当前位置: 首页 > news >正文

基于log4j的自定义traceid实现

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

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

        }
    }
}

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.11</version> <!-- 确保选择适合你项目的版本 -->
        </dependency>
<?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>

相关文章:

  • Spring AOP(教科书式的教程)
  • FASIONAD:自适应反馈的类人自动驾驶中快速和慢速思维融合系统
  • 使用AoT让.NetFramework4.7.2程序调用.Net8编写的库
  • QT异步编程之线程池QThreadPool
  • Chromium项目相关
  • 增强for循环
  • 基于yolov8的糖尿病视网膜病变严重程度检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面
  • 15.12 LoRA低秩适配微调:微软的高效微调革命
  • 计算机网络基础:揭开网络世界的神秘面纱
  • Word 插入图片会到文字底下解决方案
  • 浅谈流媒体协议以及视频编解码
  • python秒杀活动支撑方案教程
  • MRI学习第一章-核磁共振物理基础(一)
  • c++ 中的 auto 与 const 关键字
  • Go Channel 高级模式实战:超时控制与广播机制的深度解析
  • Android 端侧运行 LLM 框架 MNN 及其应用
  • C++内部类用法介绍
  • EasyRTC:支持任意平台设备的嵌入式WebRTC实时音视频通信SDK解决方案
  • [Java基础] JVM常量池介绍(BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗)
  • 处理DeepSeek返回的markdown文本
  • 怎么做自己的手机网站/上海最专业的seo公司
  • 贵阳网站设计报价/网站seo外包靠谱吗
  • 长沙专业的网站建设企业/百度推广电话客服
  • 北京市建委网站官网/凡科建站客服电话
  • 大庆开发网站公司/百度推广一个月多少钱
  • 怎么自己在电脑上做网站/国外搜索引擎优化