JBOSS 4.2.2 サーバーを使用して複数の Web アプリケーションをデプロイしています。各アプリケーションは Hibernate を使用し、アプリケーションごとに個別のログ ファイルと個別のアペンダがあります。現在、1 つのアプリケーションの Hibernate ログ ステートメントは、その特定のアプリケーションのログ ファイルに記録する必要があります。これを達成するためにlog4j.xmlファイルを構成する方法を知っている人はいますか?
4 に答える
JBossでは、ここで説明するようにTCLフィルターを使用できます。操作する構成の部分にフィルターを追加するだけです。
例(上記のソースから少し変更しました。 「アプリケーションを.warファイルとしてデプロイする」セクションを参照してください):
<appender name="App1Log" class="org.apache.log4j.FileAppender">
<errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler" />
<param name="Append" value="false"/>
<param name="File" value="${jboss.server.log.dir}/app1.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %-5p [%8.8t][%20.20c] %m%n"/>
</layout>
<filter class="org.jboss.logging.filter.TCLFilter">
<param name="AcceptOnMatch" value="true"/>
<param name="DeployURL" value="app1-exp.war"/>
</filter>
</appender>
- NDCを追加します。ログは引き続き同じファイルに移動しますが、ファイルのgrepははるかに簡単になります。
- 各アプリケーションが独自のlog4j.xmlを持つことができるように、JBossクラスローディングを変更します
複数のアプリケーションでそれぞれ hibernate を実行している場合は、アプリケーション log4j.xml ファイルに hibernate クラスのクラスパス (org.hibernate) を使用して hibernate 用のアペンダーを作成するだけで、出力が指定されたログ ファイルに送信されます。
それでもうまくいかない場合は、休止状態がライブラリ jar にバンドルされている log4j プロパティ ファイルを取得していないことを確認してください。hibernate が log4j.xml ファイルを見つけられない場合、system.out に警告メッセージが表示されます。
カール
あなたの問題を正しく理解しているかどうか、100%確信が持てません。ログステートメントを発行するアプリケーションに応じて、同じロガーからの出力を別のファイルに送信したいと考えています。
Log4J はマップされた診断コンテキストを提供します。このコンテキストは、休止状態のコードが実行される前に (アプリケーションに応じて) 別の値に設定できます。hibernate によって発行される各ログステートメントには、MDC の内容も含まれます。
これにより、MDC の内容を検査し、ログ メッセージを別のファイルに書き込む特別なアペンダーを作成できます。
私は、すべてのスレッドが独自のログ ファイルを生成する重いマルチスレッド アプリケーションでこのアプローチを使用しましたが、非常にうまく機能します。