gpt4 book ai didi

Java 日志记录 - slf4j、log4j

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:19:52 25 4
gpt4 key购买 nike

有没有办法向 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 日志记录框架(或在其接口(interface)中类似)

最佳答案

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

SLF4J 支持 MDC,即映射诊断上下文。如果底层日志记录框架提供 MDC 功能,那么 SL​​F4J 将委托(delegate)给底层框架的 MDC。请注意,目前只有 log4j 和 logback 提供 MDC 功能。

当您使用 log4j 标记问题并且您的示例引用了 log4j 类时,SLF4J 将允许您在基于线程的 MDC 映射中设置值 使用 slf4j API。然后,这些值将在 LoggingEventlog4j 级别本地访问。

这是一个改编自 Logback manual 的例子在 SLF4J 手册中引用(以及@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");
}
}

然后,在您的自定义附加程序中,您可以轻松获取值:

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

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

当然,通过 Logback 可以获得相同的功能......

关于Java 日志记录 - slf4j、log4j,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30148331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com