我们如何使用 logback.xml 和 MDC 在 spring-boot 日志记录中获取用户请求、响应和请求 ID 以及进程 ID?

How do we get user request, response, and request-id along with process-id in spring-boot logging using logback.xml and MDC?

我一直在尝试为我的 spring-boot 项目创建一个 logback.xml 日志模式我可以得到一些要求。

我想以日志模式打印数据(例如process-idrequest-id,特定用户请求数据API 请求、用户响应等)使用 MDC 但我找不到任何关于 MDC 通信方式的解决方案使用 logback.xml 并插入所需的值。

我是 spring-boot 和 Java 开发的新手;请给我一些解决方案或想法。

您可以使用 put

在 MDC 中添加值
MDC.put("process-id", "1");

然后定义一个日志模式,将这些值与 %X

一起使用
%X{process-id}

例如,您可以在 application.properties:

中定义模式
logging.pattern.console=%-4r [%thread] %-5level %X{process-id} - msg%n

或在logback.xml

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <layout>
      <Pattern>%-4r [%thread] %-5level %X{process-id} - msg%n</Pattern>
    </layout>       
</appender>

你好,我有一个解决方案,Apache-Log4j 给出的一个 class 是 ThreadContext。借助这个 class 我们可以 add/remove MDC 上下文中的数据。

请按照以下步骤操作:

  • 创建一个 Servlet 过滤器或 Spring 给定过滤器。
  • 从 'org.apache.logging.log4j' 包中导入 ThreadContext calss。
  • 并在日志模式中添加“[%X]”
  • 请按照下面的代码。

     import org.apache.logging.log4j.ThreadContext;
    
     @Component
     public class MyInterceptor extends HandlerInterceptorAdapter {
    
    
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse 
     response, Object handler) {
    
             RuntimeMXBean bean = ManagementFactory.getRuntimeMXBean();
    
            long pid = Long.valueOf(bean.getName().split("@")[0]);
    
            ThreadContext.put("process-id", pid);
            ThreadContext.put("request-id", request.getParameter("requestid"));  //etc.. add Something..
    
    
    return true;
    }
    
      @Override
     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
        throws Exception {
    
    ThreadContext.put("response", "add here");  //etc.. response.getSomething
    
    ThreadContext.clearMap(); //this remove all in the MDC 
    }
    
    }
    

    或者,
    除了这个,你也可以使用 ServletFilter。