質問
ログメッセージの内容に基づいて、サードパーティライブラリの特定のコンポーネントからのログイベントをフィルタリングしたいと思います。ログイベントが特定のロガー(「org.restlet.Component.LogService」)によって生成された場合にのみ、このフィルタリングを適用する必要があります。フィルタリング自体は、ログイベントメッセージに対する基本的な一致にすぎません。
複数のアペンダーにログを記録する中央のAsyncAppenderがあります。 LogServiceからのイベントが除外されない場合、それらを現在と同じように処理したいです。つまり、AsyncAppenderに送信されます。 AsyncAppenderにフィルターを追加したくありません。これは非常に非効率的だからです(LogServiceロガーからのイベントだけをすべてフィルターする必要はありません)。
だから私がやろうとしたことは、LogServiceロガーをカスタムAppenderに関連付けることです。カスタムAppenderは、カスタムフィルターに関連付けられます。
<appender name="filtered" class="mystuff.FilteredAppender">
<filter class="mystuff.EventFilter"/>
<appender-ref ref="ASYNC"/>
</appender>
<logger name="org.restlet.Component.LogService">
<appender-ref ref="filtered"/>
</logger>
現在取得しているエラー...
log4j:ERROR [filtered]という名前のアペンダーにレイアウトが設定されていません。
...デザインに何か問題があると教えてくれます。ログイベントを渡すか渡さないかが本当に必要なため、カスタムアペンダーがレイアウトを気にする必要はないと思います。また、このアプローチには2つのカスタムクラスが必要であり、そのうちの1つ(mystuff.FilteredAppender)はまったく値を追加しません。カスタムフィルターを保持するのはそこだけです。
次のようなもっときれいなことをしたい...
<logger name="org.restlet.Component.LogService">
<filter class="mystuff.EventFilter"/>
</logger>
...しかし、これは明らかにlog4jフレームワークではサポートされていません。
イベントフィルタリングを目的の方法で実行するための適切でクリーンな方法はありますか?
解決
このメッセージボードエントリ私が仕事をすることができた解決策について説明します。 AsyncAppenderをフィルターホルダーとして使用しなければならないのは残念に思えますが、新しいカスタムAppenderを作成せずにそれが最良のオプションのようです。だから私は次のようになります:
<appender name="filtered" class="org.apache.log4j.AsyncAppender">
<filter class="mystuff.EventFilter"/>
<appender-ref ref="ASYNC"/>
</appender>
<logger name="org.restlet.Component.LogService" additivity="false">
<appender-ref ref="filtered"/>
</logger>
しかし、もっと良いアプローチを知っている人がいれば、きっと興味があります。 :-)
他のヒント
Log4Jには Extrasライブラリ( JavaDoc)は、ロガー名でフィルタリングするための LoggerMatchFilter
を提供します。ロガー名と、受け入れるか拒否するかを設定します(デフォルトでは受け入れます)。
フィルターの decide
メソッドで、ロガー名と LoggingEvent object.getLoggerName()
が等しいかどうかを比較します。これは驚くほど単純で明白なフィルターであり、Log4jにはデフォルトで付属していないことに驚いています。
別の方法として、サードパーティのライブラリを静かにしたいだけなら、次のことが役立つことがわかりました:
<!-- LOGGER NEUTER -->
<logger name="org.apache"><level value="WARN"/></logger>
<logger name="org.springframework"><level value="WARN"/></logger>