2017-03-03 26 views
0

Log4j2を使用してStringキーとInteger値をログに追加したいとします。 これを行う方法はありますか?私ははThreadContextにプロパティを追加したとき、私は唯一の文字列を追加することができました:文字列は、キーと値が、これは私がKibanaに(いくつかのグラフ)を提示する必要がある番号を持って助けにはならないlog4j2とJSONLayoutを使用したカスタムキー値

おかげで、 コビ

答えて

0

私は、デフォルトのlog4j2実装が、値付きのカスタムフィールドを渡すのにやや問題があることを発見しました。私の意見では、現在のJavaロギングフレームワークは、構造化されたログイベントの書き込みにはあまり適していません。

ハックが好きなら、https://github.com/skorhone/gelfj-alt/tree/master/src/main/java/org/graylog2/log4j2をチェックしてください。それはgelfのために書かれた図書館です。提供される機能の1つに、カスタムフィールドの抽出(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。別のソースからのKey-ValueペアをLogEventに注入することによって、ThreadContextを完全に回避することは可能です。これは(簡単に)カスタムコンテキストデータインジェクタ(http://logging.apache.org/log4j/2.x/manual/extending.html#Custom_ContextDataInjector)に記載されています。 –

0

組み込みのGelfLayoutが便利です。

デフォルトのThreadContextは、String:Stringキー値のみをサポートしています。 ObjectThreadContextMapインタフェースを実装はThreadContextマップの実装を使用するようにLog4jのを知らせる

  1. LOG4J2-1648で行われた作業は、あなたがはThreadContextで、他のタイプを使用することができます。これを達成する最も簡単な方法は、システムプロパティーlog4j2.garbagefree.threadContextMaptrueに設定することです。
  2. 標準の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)に記載されています。

関連する問題