2017-03-03 271 views
0

定制的键值我想添加到我的日志字符串键和使用Log4j2整数值。 有没有办法做到这一点?当我添加的属性到ThreadContext我可以只添加字符串:字符串键和值,但是这并不能帮助我,我需要在Kibana(一些图表)呈现log4j2和使用JSONLayout

感谢, 了Kobi

回答

0

号我发现默认的log4j2实现在传递带有值的自定义字段方面有些问题。在我看来,当前的Java日志框架不是很适合写结构性日志事件

如果你喜欢的黑客,你可以检查https://github.com/skorhone/gelfj-alt/tree/master/src/main/java/org/graylog2/log4j2。这是一个为gelf写的图书馆。提供的功能之一是支持从事件中提取自定义字段(参见FieldExtractor)的布局(ExtGelfjLayout)。但是...为了发送这样的事件,你需要在log4j2的顶部编写你自己的日志外观。

+0

Log4j2有一个内置的GelfLayout –

+0

是的,但它不支持不是字符串值。更不用说使用线程上下文传递值是多么不直观(上下文映射) –

+0

我明白你的意思了。有一些正在进行的工作来支持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)中提到的。 –

0

内置GelfLayout可能是有用的。

这是真的,默认ThreadContext只支持字符串:字符串键值。在LOG4J2-1648所做的工作可以让你在ThreadContext使用其他类型:

  1. 告诉Log4j的使用实现了ObjectThreadContextMap接口ThreadContext地图的实现。最简单的方法是将系统属性log4j2.garbagefree.threadContextMap设置为true
  2. 标准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)中提到的。