diff --git a/common/src/main/java/com/sdm/common/common/SpdmCommonConstant.java b/common/src/main/java/com/sdm/common/common/SpdmCommonConstant.java new file mode 100644 index 00000000..44c0a937 --- /dev/null +++ b/common/src/main/java/com/sdm/common/common/SpdmCommonConstant.java @@ -0,0 +1,18 @@ +package com.sdm.common.common; + +/*spdm 常量字符串定义类 */ +public class SpdmCommonConstant { + + /** + * MDC 中存储 traceId 的 key(需与日志格式中的 %X{traceId} 对应) + */ + public static final String TRACE_ID_KEY = "traceId"; + + /** + * 响应头中返回 traceId 的 key(前端可通过此 key 获取) + */ + public static final String TRACE_ID_HEADER = "X-Trace-Id"; + + + +} diff --git a/common/src/main/java/com/sdm/common/filter/TraceIdFilter.java b/common/src/main/java/com/sdm/common/filter/TraceIdFilter.java index 8355b668..b2335d04 100644 --- a/common/src/main/java/com/sdm/common/filter/TraceIdFilter.java +++ b/common/src/main/java/com/sdm/common/filter/TraceIdFilter.java @@ -1,5 +1,6 @@ package com.sdm.common.filter; +import com.sdm.common.common.SpdmCommonConstant; import jakarta.servlet.*; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -13,15 +14,7 @@ import java.util.UUID; // 拦截所有 HTTP 请求 public class TraceIdFilter implements Filter { - /** - * MDC 中存储 traceId 的 key(需与日志格式中的 %X{traceId} 对应) - */ - public static final String TRACE_ID_KEY = "traceId"; - /** - * 响应头中返回 traceId 的 key(前端可通过此 key 获取) - */ - public static final String TRACE_ID_HEADER = "X-Trace-Id"; @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) @@ -32,14 +25,14 @@ public class TraceIdFilter implements Filter { try { // 1. 生成或获取 traceId(优先从请求头获取,支持前端传递,便于联调) - String traceId = request.getHeader(TRACE_ID_HEADER); + String traceId = request.getHeader(SpdmCommonConstant.TRACE_ID_HEADER); if (traceId == null || traceId.trim().isEmpty()) { // 生成 UUID 并去除横杠(32位,简洁易读) traceId = UUID.randomUUID().toString().replace("-", ""); } // 2. 存入 MDC(供日志打印使用,所有日志框架可通过 %X{traceId} 获取) - MDC.put(TRACE_ID_KEY, traceId); + MDC.put(SpdmCommonConstant.TRACE_ID_KEY, traceId); // 3. 写入响应头(返回给前端,便于前端排查问题时匹配日志) // response.setHeader(TRACE_ID_HEADER, traceId); @@ -49,7 +42,7 @@ public class TraceIdFilter implements Filter { } finally { // 5. 清除 MDC 中的 traceId(关键!避免线程池复用导致的 traceId 污染) - MDC.remove(TRACE_ID_KEY); + MDC.remove(SpdmCommonConstant.TRACE_ID_KEY); } } diff --git a/common/src/main/java/com/sdm/common/utils/MdcUtil.java b/common/src/main/java/com/sdm/common/utils/MdcUtil.java new file mode 100644 index 00000000..66215513 --- /dev/null +++ b/common/src/main/java/com/sdm/common/utils/MdcUtil.java @@ -0,0 +1,56 @@ +package com.sdm.common.utils; + +import com.sdm.common.common.SpdmCommonConstant; +import org.slf4j.MDC; + +import java.util.UUID; + +public class MdcUtil { + + /** + * 私有构造方法,禁止实例化工具类 + */ + private MdcUtil() { + throw new UnsupportedOperationException("工具类禁止实例化"); + } + + /** + * 生成并存入 traceId 到 MDC + * @return 生成的 traceId 字符串(无横线的UUID) + */ + public static String generateAndPutTraceId() { + // 生成无横线的UUID作为traceId + String traceId = UUID.randomUUID().toString().replace("-", ""); + // 存入MDC,供日志框架通过 %X{traceId} 获取 + MDC.put(SpdmCommonConstant.TRACE_ID_KEY, traceId); + return traceId; + } + + /** + * 从 MDC 中移除 traceId(销毁) + */ + public static void removeTraceId() { + MDC.remove(SpdmCommonConstant.TRACE_ID_KEY); + } + + /** + * 获取当前 MDC 中的 traceId + * @return 当前traceId,若不存在则返回null + */ + public static String getTraceId() { + return MDC.get(SpdmCommonConstant.TRACE_ID_KEY); + } + + /** + * 手动存入指定的 traceId 到 MDC(适用于需要复用traceId的场景,如跨服务调用) + * @param traceId 自定义的traceId + */ + public static void putTraceId(String traceId) { + if (traceId == null || traceId.trim().isEmpty()) { + throw new IllegalArgumentException("traceId 不能为空"); + } + MDC.put(SpdmCommonConstant.TRACE_ID_KEY, traceId); + } + + +} diff --git a/project/src/main/java/com/sdm/project/schedule/lyric/LyricTodoListSchedule.java b/project/src/main/java/com/sdm/project/schedule/lyric/LyricTodoListSchedule.java index c02f1209..8b7914f6 100644 --- a/project/src/main/java/com/sdm/project/schedule/lyric/LyricTodoListSchedule.java +++ b/project/src/main/java/com/sdm/project/schedule/lyric/LyricTodoListSchedule.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.sdm.common.common.SdmResponse; import com.sdm.common.common.ThreadLocalContext; +import com.sdm.common.utils.MdcUtil; import com.sdm.project.service.ILyricInternalService; import com.xxl.job.core.context.XxlJobHelper; import com.xxl.job.core.handler.annotation.XxlJob; @@ -23,21 +24,26 @@ public class LyricTodoListSchedule { // xxljob平台配置定时任务 @XxlJob("lyricTodoListHandler") public void hpcJobStatusHandler() throws Exception { + // 初始化traceId + String traceId = MdcUtil.generateAndPutTraceId(); String param = XxlJobHelper.getJobParam(); if(StringUtils.isBlank(param)){ - log.warn("lyricTodoListHandler param null"); + log.warn("{} lyricTodoListHandler param null",traceId); return; } - XxlJobHelper.log("XXL-JOB:拉起lyric代办任务开始,param:{}", param); + XxlJobHelper.log("{} XXL-JOB:拉起lyric代办任务开始,param:{}", traceId,param); JSONObject paramJson = JSONObject.parseObject(param); ThreadLocalContext.setTenantId(paramJson.getLong("tenantId")); ThreadLocalContext.setUserId(paramJson.getLong("userId")); long startTime = System.currentTimeMillis(); SdmResponse response = lyricInternalService.getTodoList(); long endTime = System.currentTimeMillis(); - log.info("lyricTodoListHandler cost [{}] s", (endTime - startTime)/1000); - log.info("lyricTodoListHandler result :{}", JSON.toJSONString(response)); - XxlJobHelper.log("XXL-JOB:拉起lyric代办任务结束:{}", JSON.toJSONString(response)); + long second = (endTime - startTime) / 1000; + log.info("{} lyricTodoListHandler cost [{}] s", traceId,second); + log.info("{} lyricTodoListHandler result :{}", traceId,JSON.toJSONString(response)); + XxlJobHelper.log("{} XXL-JOB:拉起lyric代办任务结束:{},耗时:{} s", traceId,JSON.toJSONString(response),second); + // 销毁 + MdcUtil.removeTraceId(); } } diff --git a/project/src/main/resources/logback.xml b/project/src/main/resources/logback.xml index a00cd629..dd0130d0 100644 --- a/project/src/main/resources/logback.xml +++ b/project/src/main/resources/logback.xml @@ -1,44 +1,61 @@ - + - + - + + - ${CONSOLE_LOG_PATTERN} - UTF-8 - - - - - ${LOG_HOME}/console.log.%d{yyyy-MM-dd}.log - + + + + ${LOG_HOME}/running.log + + ${LOG_HOME}/running.log.%d{yyyy-MM-dd}.%i.log 30 500MB - true + 10MB - ${FILE_LOG_PATTERN} - UTF-8 - - - - + + + INFO + + + + + + ${LOG_HOME}/running_debug.log + + ${LOG_HOME}/running_debug.log.%d{yyyy-MM-dd}.%i.log + 30 + 500MB + 10MB + + + ${FILE_LOG_PATTERN} + + + + DEBUG + ACCEPT + DENY + @@ -59,15 +76,17 @@ - + - - + + + + - + @@ -111,6 +130,7 @@ +