エグゼクティブサマリー
ログメッセージが呼び出されたサーブレットでフィルタリングするにはどうすればよいですか? (現在 2.0 beta8 を使用)
どうしてそんなことをしたいんだろう...
いくつかの既存の Web アプリケーションがあります。これらは、独自のログ システムに依存するように作成されています。プロプライエタリ システムのキー クラスを最初から再実装し、クラスとしてプロプライエタリ システムを jar として追加し、log4j 2.0 を tomcat の jar として追加しました。これにより、Tomcat のクラス ロード ロード オーダーを利用して、プロプライエタリ システムを log4j に流用しました。 . これは成功し、私の log4j 設定がすべてを制御するようになりました (イェイ!)。
でも…(「でも」は必ずある!)
4 つのアプリケーションすべてが同じコンテナーにデプロイされているため、conf/log4j2.xml に配置した (-Dlog4j.configurationFile=/mnt/kui/tomcat/conf/log4j2.xml
コマンドを渡すことで指定した) 単一の構成内の単一のログ ファイルへの書き込みを調整していないことが判明するまで、私は非常に満足していました。ライン)。ログ ファイルの途中で、はるかに古いタイム スタンプ (数時間前) のログ メッセージを見つけました。もちろん、順序が乱れたログ (およびログ行が上書きされる可能性もありますか?) は望ましくありません。
とにかく、それらすべてを1つのファイルにまとめたくはありません.1つの構成ファイルによって制御されるアプリケーションごとのログを好むでしょう。最初は、log4j が Web アプリケーションの名前で LoggingContext を自動的に設定するので、これは簡単に実現できると思っていました。
ただし、LoggingContext でフィルター処理できるフィルターの実装が見つからないようです。各アプリケーションの観点からはロギングコンテキストが1つしかないことを理解しています(私は思います)が、同じ構成ファイルが4つのアプリケーションによって読み取られるため、構成の観点から LoggingContext は一意ではありません。
アプリケーションごとに構成ファイルを用意したり、すべてのアプリケーションにクラスを追加したり、war ファイル (web.xml を含む) を編集したりすることなく、各アプリケーションを独自のファイルにルーティングする方法を探しています。私はすっごく... 近いですが、うまくいきません。
問題を複雑にするために、このロギングを使用する 4 つのアプリケーションすべてで共有される、私たちが作成した jar ファイルがあり、1 つのアプリケーションは、そのクラスで直接 log4j を使用するように変換されています (ただし、独自のロギング クラスを参照する独自のクラスを引き続き使用します)。交換しました)。
私はすでにhttp://logging.apache.org/log4j/2.x/manual/logsep.htmlを見ており、私のケースは「共有」Web アプリケーションと REST サービス コンテナに最も近いようですが、そのケースはあまりないようです。そのページでよくカバーされています。