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);
    }
相关推荐
忧郁的Mr.Li4 分钟前
SpringBoot中实现多数据源配置
java·spring boot·后端
yq19820430115617 分钟前
静思书屋:基于Java Web技术栈构建高性能图书信息平台实践
java·开发语言·前端
一个public的class18 分钟前
你在浏览器输入一个网址,到底发生了什么?
java·开发语言·javascript
有位神秘人19 分钟前
kotlin与Java中的单例模式总结
java·单例模式·kotlin
golang学习记24 分钟前
IntelliJ IDEA 2025.3 重磅发布:K2 模式全面接管 Kotlin —— 告别 K1,性能飙升 40%!
java·kotlin·intellij-idea
爬山算法27 分钟前
Hibernate(89)如何在压力测试中使用Hibernate?
java·压力测试·hibernate
暮色妖娆丶1 小时前
SpringBoot 启动流程源码分析 ~ 它其实不复杂
spring boot·后端·spring
消失的旧时光-19431 小时前
第十四课:Redis 在后端到底扮演什么角色?——缓存模型全景图
java·redis·缓存
BD_Marathon1 小时前
设计模式——依赖倒转原则
java·开发语言·设计模式
BD_Marathon1 小时前
设计模式——里氏替换原则
java·设计模式·里氏替换原则