2017-03-03 275 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)中提到的。