Java日志记录 - slf4j,log4j

3

有没有一种方法可以将属性映射传递给slf4j记录器?

例如,我想做这样的事情:

Logger logger = LoggerFactory.getLogger(SomeClass.class);

Map data = new HashMap<String, String>();
data["key1"] = "value1";
data["key2"] = "value2";

logger.info("my info message", data)

然后,我希望我的 appender 能够接收 log4j LoggingEvent,并包含上述参数,就像这样:

public class MyAppender extends AppenderSkeleton {
...
...

@Override
protected void append(LoggingEvent event) {
    Map properties = event.getProperties();
    String valueOfKey1 = (String) properties.get("key1");   
    //valueOfKey1 sould be equal to 'value1'
}
...
...    

更新:

是否有任何支持传递HashMap数据(或类似于其接口)的Java日志记录框架?


你在“HashMap”前面漏掉了“new”。 - Suspended
2
你正在寻找MDC吗? - Seelenvirtuose
也许...我不太熟悉这个..你能详细说明一下吗? - Guy Segal
你应该查找一些log4j mongodb附加器。 - ramazan polat
1个回答

2

来自SLF4J手册,“映射诊断上下文”本质上是由日志框架维护的一个地图,应用程序代码提供键值对,然后日志框架可以将其插入日志消息中。 MDC数据在过滤消息或触发某些操作方面也可以非常有帮助。

SLF4J支持MDC或映射诊断上下文。如果底层日志记录框架提供MDC功能,则SLF4J将委托给底层框架的MDC。请注意,目前只有log4j和logback提供MDC功能。

由于您使用了log4j标签,并且您的示例引用了log4j类,因此SLF4J将允许您使用slf4j API在线程基础上将值设置到MDC映射中。这些值将在LoggingEvent中以本机方式访问。

这是一个示例,改编自在SLF4J手册中引用的Logback手册(也被@Seelenvirtuose在评论中提到):
public class SimpleMDC {
  static public void main(String[] args) throws Exception {

    // You can put values in the MDC at any time. Before anything else
    // we put the first name
    MDC.put("key1", "value1");

    [ SNIP ]

    Logger logger = LoggerFactory.getLogger(SimpleMDC.class);
    // We now put the last name
    MDC.put("key2", "value2");

    logger.info("Info log message");
  }
}

然后,在您的自定义 appender 中,您可以轻松获取这些值:
public class MyAppender extends AppenderSkeleton {
...
...

@Override
protected void append(LoggingEvent event) {
    String valueOfKey1 = (String) event.getMDC("key1");   
    //valueOfKey1 should be equal to 'value1'
}
...
... 

当然,相同的功能也可以通过Logback实现...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接