単一EAR内の別の戦争のために複数のlog4jを構成する方法?
-
11-09-2019 - |
質問
私のような構造を持つEARを持っています:
APP.ear
- APP1.war
- WEB-INF/classes/log4j.properties
- APP2.war
- WEB-INF/classes/log4j.properties
- app1-ejb.jar
- app2-ejb.jar
- log4j.jar
- spring.jar
- commons-lang.jar (...and other jar)
私は、各WARが自分のアプリケーションログを持っていると思います。しかし、上記の構成が動作しないようです。 APP1とAPP2のログAPP1のログになります。別のアプリのログを作成するために、とにかくありますか?
解決
それが原因クラスローダには不可能だということが判明しました。クラスローダの階層は次のようである。
アプリケーションクラスローダ - > EJBクラスローダ - >戦争のクラスローダ
個々の戦争のためのsepearteログを持っているために、一つは戦争の内側にあるlog4j.jar入れて、log4jのは、戦争のクラスローダを使用させることができます。 APP1-ejb.jarなどとAPP2-ebj.jar両方ものlog4jを使用する必要があるとしてではなく、あるlog4j.jarはトップレベルに配置することができます。だから、log4jはアプリケーションクラスローダレベルである。
私は別のファイルに異なるパッケージをログに記録する単一のlog4jの設定を指定することができます。しかし、春のような一般的なライブラリのために、ログがsepeartedすることはできません。
他のヒント
理由はそれdidntの仕事log4jのではなく、各戦争がそのWEB-INF / libディレクトリにあるlog4j.jarを持たせ、ルートからあるlog4j.jarを削除し、ルートの場所に存在しているからである。
この本で私のブログの記事を参照してください。詳細は http://techcrawler.wordpress.com/する
また、動的にプロパティファイル内のファイルプロパティを変更することにより、コード内にPropertyConfiguratorを使用していることを行うことができます。
Logbackは、この問題に対処するための実行可能なソリューションです。 log4jので、この作業をするためにさまざまなハック周りを見た後、我々はLogbackに切り替えることを決めました。私は、Webアプリケーション内のLogbackジャーに以下の構成を使用しています。
外部ファイルを含むWebアプリケーション内部Logbackファイル
<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="10 seconds">
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
<resetJUL>true</resetJUL>
</contextListener>
<contextName>${project.artifactId}</contextName>
<jmxConfigurator />
<include file="${logback.configuration.filepath}" />
</configuration>
${logback.configuration.filepath}
は、設定ファイル(の/opt/server/conf/loback.included.conf のようなもの)のWebアプリケーションへの外部の正確なパス、によって、Mavenのフィルタリング中に交換されます。
そして、logback.included.conf
の内容(このファイルはbuild-helper:attach-artifact
で提供projetctの一部であるので、${project.artifactId}
もMavenのフィルタリング中に置換される)
<?xml version="1.0" encoding="UTF-8" ?>
<included>
<appender name="file" class="ch.qos.logback.core.FileAppender">
<file>/var/log/server/${project.artifactId}.log</file>
<encoder>
<pattern>[@/%contextName] %date{ISO8601} [%-5level] %thread:[%logger] %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="file" />
</root>
</included>
唯一の制限は、インクルードされたファイルの内容は、includerの1に準拠している必要があります。ただ、実際にはルールを書いています。