作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有没有办法向 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 功能,那么 SLF4J 将委托(delegate)给底层框架的 MDC。请注意,目前只有 log4j 和 logback 提供 MDC 功能。
当您使用 log4j
标记问题并且您的示例引用了 log4j
类时,SLF4J 将允许您在基于线程的 MDC 映射中设置值 使用 slf4j API。然后,这些值将在 LoggingEvent
的 log4j
级别本地访问。
这是一个改编自 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/
我是一名优秀的程序员,十分优秀!