如何向所有日志语句添加新的日志值

how to add new log value to all logging statements

我在 project.there 中使用带有 logback 的 slf4j 是一个 request_id 存储在 ThreadLoacal 中。 我想将这个请求 id 的值添加到所有日志语句中。 有没有什么方法可以让记录器隐式地获取 request_id 的值并记录它,而不是在现有的日志语句中传递它?

您应该可以使用自定义转换器执行此操作。

This Answer to another question 显示了如何使用转换器合并已保存在线程局部变量中的线程标识符。您应该能够对此进行调整以合并请求 ID。

This section of the logback manual 描述了如何将自定义转换器挂接到您的 logback 配置中。

Slf4j 和 logback 都支持使用映射诊断上下文 (MDC)。您可以将命名值添加到 MDC,这些值将传递给记录器。日志记录模式支持输出标记。

请注意,MDC 卡在您的线程中,即使用不同的线程时上下文会丢失。并且随着线程的重用,上下文会重新出现,所以在这种情况下清理很重要。

这可能很乏味,但是,我相信它会做到的

  1. 首先 configure sl4j logging 使用 JDK 记录器。
  2. 编写您自己的格式化程序,或像这样重写 Java SimpleFormatter

    package com.mypackage
    public class MyFormatter extends SimpleFormatter{
    
        @Override
        public String format(LogRecord record){
            String simpleFormattedLog = super.format(record);
            String simpleFormattedLogWithThreadID = "THREAD_ID(" + getThreadId() + ") _ " + simpleFormattedLog; 
           return  simpleFormattedLogWithThreadID;
        }
    
    
    
        private String getThreadId(){
            return  "GET THREAD ID HERE";
        }
    
    }
    

    然后 specify the formatter in the properties file

     java.util.logging.ConsoleHandler.formatter = com.mypackage.MyFormatter
    

这应该行得通,所有事情都是平等的。