6

Log4j2 の新しい RoutingAppender を使用して、MDC (Log4j2 の ThreadContext) に基づいてさまざまなログをルーティングしようとしています。私がやりたいことは次のとおりです。

  • MDC マップに $contextId がある場合 -> $contextId アペンダーに追加 (特定のログ)
  • MDC に $contextId がない場合 -> メイン アペンダーに追加 (一般ログ)

タグでワイルドカードパターンを使用してこれを実現し、for contextId (${ctx:contextId}) のキーパラメーターを使用してフィルタリングし、メインアペンダーのデフォルト (キーパラメーターなし) を使用しますが、そうではありませんそのワイルドカードの値を知っています。

間違った道からこれに近づいているのかもしれません。フィルターについて読んでいますが、思い通りに動作しないようです。

ありがとう!

4

4 に答える 4

2

これはあなたの質問に答えていますか?https://issues.apache.org/jira/browse/LOG4J2-326

レムコ

于 2013-08-17T23:11:09.150 に答える
2

フォローアップして解決策を投稿してくれてありがとうhveiga。役に立ちました。http://logging.apache.org/log4j/2.x/faq . html#separate_log_files

したがって、更新された log4j 構成は次のようになります。

<appenders>
    <appender name="applicationAppender" type="RollingFile" fileName="${logFileName}" filePattern="${logFileNamePattern}" bufferedIO="true" immediateFlush="true" append="true">
        <layout type="PatternLayout" pattern="${logPattern}" />
        <Policies>
            <TimeBasedTriggeringPolicy />
            <SizeBasedTriggeringPolicy size="${logFileSize}" />
        </Policies>
        <DefaultRolloverStrategy max="${logFileCount}" />
    </appender>

    <Routing name="contextSpecificAppender">
        <Routes pattern="$${ctx:contextId}">
            <Route>
                <appender name="Rolling-${ctx:contextId}" type="RollingFile" fileName="logs/${ctx:contextId}.log" filePattern="${logFileNamePattern}" bufferedIO="true" immediateFlush="true" append="true">
                    <layout type="PatternLayout" pattern="${logPattern}" />
                    <Policies>
                        <TimeBasedTriggeringPolicy />
                        <SizeBasedTriggeringPolicy size="${logFileSize}" />
                    </Policies>
                    <DefaultRolloverStrategy max="${logFileCount}" />
                </appender>
            </Route>
            <Route ref="applicationAppender" key="$${ctx:contextId}">
            </Route>
        </Routes>
    </Routing>
</appenders>

<loggers>
    <root level="info">
        <appender-ref ref="contextSpecificAppender"/>
    </root>
</loggers>

また、アプリケーションでは、ThreadContext.put("contextId", "something") を呼び出して ThreadContext を設定し、完了したら ThreadContext.clear() OR ThreadContext.remove("contextId") を呼び出してクリアできます。

最後に、私は

<RollingFile>

要素(上記の例のように)の代わりに

<appender type="RollingFile"> 

使用した要素。これは、log4j から log4j2 に移行する場合に適していると思います。

于 2014-06-13T23:26:43.807 に答える
1

https://issues.apache.org/jira/browse/LOG4J2-326およびhttp://logging.apache.org/log4j/2.x/で説明されているトリックを使用してフォールバック ルートを定義するソリューションに不満がありました。 faq.html#separate_log_files、これにより、ルートに含まれるアペンダー構成を複製する必要があるためです。デフォルト ルートに別のアペンダー構成は必要ありませんが、一般的なログには適切なファイル名が必要です。

デフォルトのプロパティ マップがそのコンテキストで定義されていないプロパティを検索することを考えると、 https://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitutionを参照してください。最も簡単な方法だと思います。デフォルトを定義するだけです。

<Properties>
    <Property name="fruits">any_fruit</Property>
</Properties>

スレッド コンテキストに ${ctx:fruits} がない場合は、「any_fruit」が使用されます。

于 2016-09-14T09:23:30.807 に答える