diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 9e9780464..326c1a6b7 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -93,6 +93,12 @@
ruoyi-workflow
+
+
+ org.dromara
+ ruoyi-common-mdc
+
+
de.codecentric
spring-boot-admin-starter-client
diff --git a/ruoyi-admin/src/main/resources/logback-plus.xml b/ruoyi-admin/src/main/resources/logback-plus.xml
index b74289ecd..a8c47d79a 100644
--- a/ruoyi-admin/src/main/resources/logback-plus.xml
+++ b/ruoyi-admin/src/main/resources/logback-plus.xml
@@ -2,7 +2,7 @@
+ value="%cyan(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %red([%X{requestId}]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 2930fd0b0..e7ce5b434 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -34,6 +34,7 @@
ruoyi-common-tenant
ruoyi-common-websocket
ruoyi-common-sse
+ ruoyi-common-mdc
ruoyi-common
diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml
index 62967c30d..c31685a75 100644
--- a/ruoyi-common/ruoyi-common-bom/pom.xml
+++ b/ruoyi-common/ruoyi-common-bom/pom.xml
@@ -179,6 +179,13 @@
${revision}
+
+
+ org.dromara
+ ruoyi-common-mdc
+ ${revision}
+
+
diff --git a/ruoyi-common/ruoyi-common-mdc/pom.xml b/ruoyi-common/ruoyi-common-mdc/pom.xml
new file mode 100644
index 000000000..9e4f37e8a
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-mdc/pom.xml
@@ -0,0 +1,28 @@
+
+
+
+ org.dromara
+ ruoyi-common
+ ${revision}
+
+ 4.0.0
+
+ ruoyi-common-mdc
+
+
+ ruoyi-common-mdc 全局请求id模块
+
+
+
+
+
+
+ org.dromara
+ ruoyi-common-web
+
+
+
+
+
diff --git a/ruoyi-common/ruoyi-common-mdc/src/main/java/org/dromara/common/mdc/config/MdcAutoConfiguration.java b/ruoyi-common/ruoyi-common-mdc/src/main/java/org/dromara/common/mdc/config/MdcAutoConfiguration.java
new file mode 100644
index 000000000..b6d126a55
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-mdc/src/main/java/org/dromara/common/mdc/config/MdcAutoConfiguration.java
@@ -0,0 +1,25 @@
+package org.dromara.common.mdc.config;
+
+import org.dromara.common.mdc.filter.RequestIdFilter;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+
+/**
+ * 短信配置类
+ *
+ * @author Feng
+ */
+@AutoConfiguration
+public class MdcAutoConfiguration {
+
+ @Bean
+ public FilterRegistrationBean requestIdFilterRegistration(RequestIdFilter requestIdFilter) {
+ FilterRegistrationBean registration = new FilterRegistrationBean<>();
+ registration.setFilter(requestIdFilter);
+ // 确保是最先执行的过滤器之一
+ registration.setOrder(1);
+ registration.addUrlPatterns("/*");
+ return registration;
+ }
+}
diff --git a/ruoyi-common/ruoyi-common-mdc/src/main/java/org/dromara/common/mdc/filter/RequestIdFilter.java b/ruoyi-common/ruoyi-common-mdc/src/main/java/org/dromara/common/mdc/filter/RequestIdFilter.java
new file mode 100644
index 000000000..4e9f98dbc
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-mdc/src/main/java/org/dromara/common/mdc/filter/RequestIdFilter.java
@@ -0,0 +1,60 @@
+package org.dromara.common.mdc.filter;
+
+import cn.hutool.core.util.StrUtil;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
+import org.springframework.stereotype.Component;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import java.io.IOException;
+import java.util.UUID;
+
+/**
+ * 请求ID过滤器
+ * 为每个HTTP请求生成唯一的请求ID并放入MDC中
+ */
+@Component
+@Slf4j
+public class RequestIdFilter extends OncePerRequestFilter {
+
+ public static final String REQUEST_ID_KEY = "requestId";
+ public static final String REQUEST_ID_HEADER = "X-Request-ID";
+
+ @Override
+ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
+ throws ServletException, IOException {
+ try {
+ // 尝试从请求头中获取请求ID(支持从上游服务传递过来)
+ String requestId = request.getHeader(REQUEST_ID_HEADER);
+
+ // 如果请求头中没有请求ID,则生成一个新的
+ if (StrUtil.isBlank(requestId)) {
+ requestId = generateRequestId();
+ log.debug("生成新的请求ID: {}", requestId);
+ // 将请求ID添加到响应头中
+ response.addHeader(REQUEST_ID_HEADER, requestId);
+ } else {
+ log.debug("从请求头获取到请求ID: {}", requestId);
+ }
+
+ // 将请求ID放入MDC
+ MDC.put(REQUEST_ID_KEY, requestId);
+ // 继续过滤器链
+ filterChain.doFilter(request, response);
+ } finally {
+ // 清理MDC,防止内存泄漏
+ MDC.remove(REQUEST_ID_KEY);
+ }
+ }
+
+ /**
+ * 生成请求ID
+ */
+ private String generateRequestId() {
+ return UUID.randomUUID().toString().replace("-", "");
+ }
+}
diff --git a/ruoyi-common/ruoyi-common-mdc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-mdc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
new file mode 100644
index 000000000..0ce3f2c99
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-mdc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -0,0 +1 @@
+org.dromara.common.mdc.config.MdcAutoConfiguration