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);
    }
相关推荐
努力学编程呀(๑•ี_เ•ี๑)9 小时前
【在 IntelliJ IDEA 中切换项目 JDK 版本】
java·开发语言·intellij-idea
码农小卡拉9 小时前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
向上的车轮9 小时前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net
Dragon Wu9 小时前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
跳动的梦想家h10 小时前
环境配置 + AI 提效双管齐下
java·vue.js·spring
坚持就完事了10 小时前
Java中的集合
java·开发语言
wjhx10 小时前
QT中对蓝牙权限的申请,整理一下
java·数据库·qt
一个有梦有戏的人10 小时前
Python3基础:进阶基础,筑牢编程底层能力
后端·python
YCY^v^10 小时前
JeecgBoot 项目运行指南
java·学习
人间打气筒(Ada)10 小时前
jenkins基于Pipeline发布项目
java·pipeline·jenkins·流水线·ci·cd·cicd