Log4j2を使用してStringキーとInteger値をログに追加したいとします。 これを行う方法はありますか?私ははThreadContextにプロパティを追加したとき、私は唯一の文字列を追加することができました:文字列は、キーと値が、これは私がKibanaに(いくつかのグラフ)を提示する必要がある番号を持って助けにはならないlog4j2とJSONLayoutを使用したカスタムキー値
おかげで、 コビ
Log4j2を使用してStringキーとInteger値をログに追加したいとします。 これを行う方法はありますか?私ははThreadContextにプロパティを追加したとき、私は唯一の文字列を追加することができました:文字列は、キーと値が、これは私がKibanaに(いくつかのグラフ)を提示する必要がある番号を持って助けにはならないlog4j2とJSONLayoutを使用したカスタムキー値
おかげで、 コビ
私は、デフォルトのlog4j2実装が、値付きのカスタムフィールドを渡すのにやや問題があることを発見しました。私の意見では、現在のJavaロギングフレームワークは、構造化されたログイベントの書き込みにはあまり適していません。
ハックが好きなら、https://github.com/skorhone/gelfj-alt/tree/master/src/main/java/org/graylog2/log4j2をチェックしてください。それはgelfのために書かれた図書館です。提供される機能の1つに、カスタムフィールドの抽出(FieldExtractorを参照)をイベントからサポートするレイアウト(ExtGelfjLayout)があります。しかし...私はそのようなイベントを送るために、あなたはlog4j2の上に独自のロギングファサードを書く必要があります。
組み込みのGelfLayoutが便利です。
デフォルトのThreadContextは、String:Stringキー値のみをサポートしています。 ObjectThreadContextMapインタフェースを実装はThreadContextマップの実装を使用するようにLog4jのを知らせる
log4j2.garbagefree.threadContextMap
をtrue
に設定することです。標準のThreadContextファサードにはStringのメソッドしかないため、独自のファサードを作成する必要があります。以下に動作するはずです:
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();
}
}
のLogEventに別のソースからキーと値のペアを注入することにより、完全にはThreadContextを回避することができます。これは、(簡潔に)カスタムコンテキストデータインジェクタ(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。別のソースからのKey-ValueペアをLogEventに注入することによって、ThreadContextを完全に回避することは可能です。これは(簡単に)カスタムコンテキストデータインジェクタ(http://logging.apache.org/log4j/2.x/manual/extending.html#Custom_ContextDataInjector)に記載されています。 –