9

次のような構造の 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 のログに移動します。別のアプリログを作成する方法はありますか?

4

4 に答える 4

8

クラスローダーが原因で不可能であることが判明しました。クラスローダーの階層は次のようになります。

アプリケーション クラスローダ -> EJB クラスローダ -> war クラスローダ

個々の戦争の個別のログを作成するには、log4j.jar を war 内に配置し、log4j に war クラスローダーを使用させることができます。ただし、app1-ejb.jar と app2-ebj.jar の両方で log4j も使用する必要があるため、log4j.jar は最上位にしか配置できません。したがって、log4j はアプリケーション クラスローダー レベルにあります。

単一の log4j 構成を指定して、さまざまなパッケージをさまざまなファイルに記録できます。ただし、Spring などの共通ライブラリの場合、ログを区切ることはできません。

于 2009-04-20T03:50:11.787 に答える
1

log4j がルートの場所に存在するために機能しなかった理由は、代わりに、各 war の WEB-INF/lib ディレクトリに Log4j.jar を配置し、ルートから log4j.jar を削除することです。

詳細については、 http://techcrawler.wordpress.com/の私のブログ記事を参照してください。

于 2010-06-22T11:09:03.903 に答える
0

Logback は、この問題に対処する実行可能なソリューションです。これを log4j で動作させるためにさまざまなハックを調べた後、Logback に切り替えることにしました。Web アプリケーション内の Logback jar で次の構成を使用しました。

外部ファイルを含む webapp 内の 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}Maven フィルタリング中に、構成ファイルの webapp の外部にある正確なパス ( /opt/server/conf/loback.included.confなど) に置き換えられます。

次に、の内容logback.included.conf(このファイルはプロジェクトの一部であり、 で配信されるbuild-helper:attach-artifactため、${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>

唯一の制限として、含まれるファイルの内容は、インクルーダーの内容に準拠している必要があります。実際にルールを書くだけです。

于 2011-09-28T07:16:21.767 に答える