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);
    }
相关推荐
R-sz1 天前
app登录接口实现,基于JWT的APP登录认证系统实现方案
java·开发语言·python
无籽西瓜a1 天前
ArrayList和LinkedList的区别
java
Elieal1 天前
@Api 系列注解
java·开发语言
Remember_9931 天前
【数据结构】深入理解Map和Set:从搜索树到哈希表的完整解析
java·开发语言·数据结构·算法·leetcode·哈希算法·散列表
小楼v1 天前
消息队列的核心概念与应用(RabbitMQ快速入门)
java·后端·消息队列·rabbitmq·死信队列·交换机·安装步骤
小北方城市网1 天前
接口性能优化实战:从秒级到毫秒级
java·spring boot·redis·后端·python·性能优化
小北方城市网1 天前
Redis 缓存设计与避坑实战:解决穿透 / 击穿 / 雪崩
java·大数据·数据库·redis·python·elasticsearch·缓存
jiayong231 天前
MINA框架面试题 - 进阶篇
java·io·mina
鸡蛋豆腐仙子1 天前
Spring的AOP失效场景
java·后端·spring