我在我的项目中使用slf4j和logback。在ThreadLoacal中存储了一个request_id。 我想将此请求ID的值添加到所有日志语句中。 有没有办法让logger隐式获取request_id的值并记录它,而不是在现有的日志语句中传递它?
答案 0 :(得分:2)
Slf4j和logback都支持使用映射的诊断上下文(MDC)。您可以将命名值添加到MDC,这些值将传递给记录器。日志记录模式支持令牌输出。
请注意,MDC会粘在您的线程上,即使用不同的线程丢失上下文。通过线程重用,上下文将重新出现,因此在这种情况下清理很重要。
答案 1 :(得分:0)
您应该可以使用自定义转换器执行此操作。
This Answer另一个问题显示了如何使用Converter来合并已保存在线程局部变量中的线程标识符。您应该能够对此进行调整以包含请求ID。
This section of the logback manual描述了如何将自定义转换器挂钩到您的logback配置中。
答案 2 :(得分:0)
这可能很乏味,但是,我相信它会这样做
编写自己的格式化程序,或像这样覆盖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
这应该有效,一切都是平等的。