定制的键值我想添加到我的日志字符串键和使用Log4j2整数值。 有没有办法做到这一点?当我添加的属性到ThreadContext我可以只添加字符串:字符串键和值,但是这并不能帮助我,我需要在Kibana(一些图表)呈现log4j2和使用JSONLayout
感谢, 了Kobi
定制的键值我想添加到我的日志字符串键和使用Log4j2整数值。 有没有办法做到这一点?当我添加的属性到ThreadContext我可以只添加字符串:字符串键和值,但是这并不能帮助我,我需要在Kibana(一些图表)呈现log4j2和使用JSONLayout
感谢, 了Kobi
号我发现默认的log4j2实现在传递带有值的自定义字段方面有些问题。在我看来,当前的Java日志框架不是很适合写结构性日志事件
如果你喜欢的黑客,你可以检查https://github.com/skorhone/gelfj-alt/tree/master/src/main/java/org/graylog2/log4j2。这是一个为gelf写的图书馆。提供的功能之一是支持从事件中提取自定义字段(参见FieldExtractor)的布局(ExtGelfjLayout)。但是...为了发送这样的事件,你需要在log4j2的顶部编写你自己的日志外观。
内置GelfLayout可能是有用的。
这是真的,默认ThreadContext只支持字符串:字符串键值。在LOG4J2-1648所做的工作可以让你在ThreadContext使用其他类型:
log4j2.garbagefree.threadContextMap
设置为true
。标准ThreadContext门面只对字符串的方法,所以你需要创建自己的门面。下面的应工作:
public class ObjectThreadContext {
public static boolean isSupported() {
return ThreadContext.getThreadContextMap() instanceof ObjectThreadContextMap;
}
public static Object getValue(String key) {
return getObjectMap().getValue(key);
}
public static void putValue(String key, Object value) {
getObjectMap().putValue(key, value);
}
private static ObjectThreadContextMap getObjectMap() {
if (!isSupported()) { throw new UnsupportedOperationException(); }
return (ObjectThreadContextMap) ThreadContext.getThreadContextMap();
}
}
有可能完全避免由ThreadContext从另一源向注入的LogEvent键 - 值对。这是(简要)在自定义上下文数据注入器(http://logging.apache.org/log4j/2.x/manual/extending.html#Custom_ContextDataInjector)中提到的。
Log4j2有一个内置的GelfLayout –
是的,但它不支持不是字符串值。更不用说使用线程上下文传递值是多么不直观(上下文映射) –
我明白你的意思了。有一些正在进行的工作来支持ThreadContext中的其他类型:https://issues.apache.org/jira/browse/LOG4J2-1648和https://issues.apache.org/jira/browse/LOG4J2-1629。通过将来自其他源的键值对注入到LogEvent中,可以完全避免使用ThreadContext。这是(简要地)在自定义上下文数据注入器(http://logging.apache.org/log4j/2.x/manual/extending.html#Custom_ContextDataInjector)中提到的。 –