SpringBoot项目整合Tlog 数据链路的规范加强

pom依赖的引入

java 复制代码
		<dependency>
			<groupId>com.yomahub</groupId>
			<artifactId>tlog-all-spring-boot-starter</artifactId>
			<version>1.3.0</version>
		</dependency>

logback的整合

java 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
  <property name="APP_NAME" value="logtest"/>
  <property name="LOG_HOME" value="./logs" />
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!--这里替换成AspectLogbackEncoder-->
    <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
      <pattern>%d{yyyy-MM-dd HH:mm:ss}[%X{userId}] [%X{traceId}] [%X{spanId}] [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>
  <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">
    <File>${LOG_HOME}/${APP_NAME}.log</File>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <FileNamePattern>${LOG_HOME}/${APP_NAME}.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
      <MaxHistory>30</MaxHistory>
      <maxFileSize>1000MB</maxFileSize>
    </rollingPolicy>
    <!--这里替换成AspectLogbackEncoder-->
    <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
    </encoder>
  </appender>


  <root level="INFO">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE" />
  </root>
</configuration>

配置类的添加

java 复制代码
配置类:
package com.eastsoft.eszhtsApi.config;

/**
 * @author ww
 * @version 1.0
 * @description MDC 生成 traceid
 * @date 2025/12/9 14:35
 */
import org.slf4j.MDC;
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;

@Component
public class TraceFilter extends OncePerRequestFilter {


        @Override
        protected void doFilterInternal(HttpServletRequest request,
                                        HttpServletResponse response,
                                        FilterChain filterChain)
                throws ServletException, IOException {

            try {
                // 1. 获取用户身份标识
                String userId = getUserId(request);
                String sessionId = request.getSession().getId();

                // 2. 获取或生成用户行为ID(跨请求)
                String userTraceId = (String) request.getSession().getAttribute("userTraceId");
                if (userTraceId == null) {
                    userTraceId = "user-" + UUID.randomUUID().toString().substring(0, 8);
                    request.getSession().setAttribute("userTraceId", userTraceId);
                    request.getSession().setAttribute("traceId", userTraceId);
                }

                // 3. 生成本次请求的链路ID
                String requestTraceId = UUID.randomUUID().toString().replace("-", "");
                String traceId = UUID.randomUUID().toString().replace("-", "");

                // 4. 设置到 MDC(用于日志)
                MDC.put("userId", userId != null ? userId : "anonymous");
                MDC.put("sessionId", sessionId);
                MDC.put("userTraceId", userTraceId);  // 用户级别的追踪ID
                MDC.put("requestTraceId", requestTraceId);  // 请求级别的追踪ID
                MDC.put("traceId", traceId);

                // 5. 记录用户行为开始
                //UserBehaviorTracker.start(userId, sessionId, requestTraceId,
                        //request.getRequestURI(), request.getMethod());

                // 继续处理请求
                filterChain.doFilter(request, response);

            } finally {
                // 记录用户行为结束
                //UserBehaviorTracker.end();
                // 清理 MDC
                MDC.clear();
            }
        }

        private String getUserId(HttpServletRequest request) {
            // 从认证信息中获取用户ID
            // 示例:从 JWT、Session 或 Header 中获取
            String userId = request.getHeader("KEY_USER_ID");
            if (userId != null) return userId;

            // 从 Session 获取
            Object userAttr = request.getSession().getAttribute("KEY_USER_ID");
            if (userAttr != null) return userAttr.toString();

            return null;
        }

}

yml

java 复制代码
tlog:
# 自动打印调用参数和时间
  enable-invoke-time-print: true
  pattern: '[$preApp][$preIp][$spanId][$traceId][$userId]'

代码示例

java 复制代码
   @AuthPassport
   @TLogAspect(value = {"id"})
    public String sdszfy(@RequestParam String method, @RequestParam String params) {
        log.info("===打印日志===");
        return sdszfyService.sdszfy(method, params);
    }
相关推荐
源码获取_wx:Fegn08952 小时前
基于springboot + vue二手交易管理系统
java·vue.js·spring boot·后端·spring·课程设计
Zsh-cs2 小时前
Spring
java·数据库·spring
爬山算法2 小时前
Springboot请求和响应相关注解及使用场景
java·spring boot·后端
程序员水自流2 小时前
MySQL InnoDB存储引擎详细介绍之事务
java·数据库·mysql·oracle
请为小H留灯2 小时前
Java实际开发@常用注解(附实战场景)
java·后端·个人开发
老华带你飞2 小时前
在线教育|基于springboot + vue在线教育系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·后端
路边草随风2 小时前
java操作cosn使用
java·大数据·hadoop
码事漫谈2 小时前
VS Code终端从入门到精通完全指南
前端·后端
码事漫谈2 小时前
现代C++系统编程中类型重解释的内存安全范式
后端