如何将新日志值添加到所有日志记录语句

时间:2015-03-05 10:00:35

标签: java logging slf4j logback

我在我的项目中使用slf4j和logback。在ThreadLoacal中存储了一个request_id。 我想将此请求ID的值添加到所有日志语句中。 有没有办法让logger隐式获取request_id的值并记录它,而不是在现有的日志语句中传递它?

3 个答案:

答案 0 :(得分:2)

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

请注意,MDC会粘在您的线程上,即使用不同的线程丢失上下文。通过线程重用,上下文将重新出现,因此在这种情况下清理很重要。

答案 1 :(得分:0)

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

This Answer另一个问题显示了如何使用Converter来合并已保存在线程局部变量中的线程标识符。您应该能够对此进行调整以包含请求ID。

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

答案 2 :(得分:0)

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

  1. 首先使用JDK记录器configure sl4j logging
  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
    
  3. 这应该有效,一切都是平等的。