2

エグゼクティブサマリー

ログメッセージが呼び出されたサーブレットでフィルタリングするにはどうすればよいですか? (現在 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 サービス コンテナに最も近いようですが、そのケースはあまりないようです。そのページでよくカバーされています。

4

1 に答える 1

0

ThreadContextMap のデータに基づいてログ ファイルを分離するために使用できる RoutingAppender を参照することをお勧めします。Web アプリ名を一意のキーとして使用できます。

順不同のログについては、古いベータ版の FastFileAppender に問題がありました。append が false の場合、古いファイルは切り捨てられませんが、新しいログ イベントによって古いファイルが最初から上書きされます。(したがって、たとえば、最新のログ イベントの後に、昨日のログ イベントが表示されます)。どのバージョンを使用していますか?

于 2013-09-01T01:03:06.567 に答える