定製的鍵值我想添加到我的日誌字符串鍵和使用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)中提到的。 –