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