2

複数の設定ファイルが使用されている場合、log4j の設定を理解するのに苦労します。

私は私のケースを説明します:

  • モジュール(web、ejb、jpa)を備えた単純なJava EEアプリがあります
  • また、Glassfish でセキュリティを処理するためのカスタム サーバー認証モジュール (SAM) も持っています。アプリでレルムを直接使用することはありません。

したがって、SAM (JAR ファイル) が内部GF_HOME\glassfish\libに格納され、EAR ファイルが に格納されるため、2 つの xml 構成ファイルがありますGF_HOME\glassfish\domains\domain1。JAR と EAR の両方に log4j.xml ファイルが含まれています。

私のlog4jライブラリはGF_HOME\glassfish\domains\domain1\libディレクトリにあります。

2 つの log4j.xml ファイルで構成を処理したい。

したがって、SAMのlog4j.xmlファイルには次のものがあります。

<?xml version="1.0" encoding="UTF-8" ?>

<appender name="FILE" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="${catalina.home}/logs/sim.log" />
    <param name="Threshold" value="DEBUG" />
    <param name="Append" value="true" />
    <param name="MaxFileSize" value="1MB" />
    <param name="MaxBackupIndex" value="1" />

    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %-5p %X{service} %X{user} [%c] %m%n" />
    </layout>
</appender>

<root>
    <priority value="DEBUG" />
    <appender-ref ref="FILE" />
</root>

そして私のアプリのlog4j.xmlで:

<?xml version="1.0" encoding="UTF-8" ?>

 <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="${catalina.home}/logs/sim.log"/>
    <param name="Threshold" value="DEBUG"/>
    <param name="Append" value="true"/>
    <param name="MaxFileSize" value="1MB"/>
    <param name="MaxBackupIndex" value="1"/>

    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %-5p %X{service} %X{user} [%c] %m%n"/>
    </layout>             
</appender>

<logger name="com.sim" additivity="true">
    <level value="FATAL" />     
</logger>

<root>
    <priority value="DEBUG" />
    <appender-ref ref="FILE" />
</root>

この構成では、ロガーレベルがSAM log4j.xml の構成を適用しているように見えるため、すべてのログを受信するため、アプリのレベルINFOやレベルなどを確認することは期待できません。実際、このファイルを削除すると、レベル のアプリのログを受け取ります。DEBUGcom.simFATALFATAL

glassfish は、見つかったすべての log4j.xml ファイルを「ミックス」または「マージ」しているようです。原理がよくわかりません。

SAM を 1 つの log4j.xml で管理し、アプリを別の独立したlog4j.xmlで管理したいだけです。

これどうやってするの?

4

1 に答える 1

1

私の投稿に答えるには:

EAR の lib ディレクトリの JAR 内に log4j.xml ファイルを含む EAR ファイルがあることを思い出してください。

新しい log4j 構成を適用するために、起動時に起動して使用する新しいサーブレットを作成しました(プロパティ ファイルを使用する場合は、 notDOMConfigurator.configure()を使用する必要があることに注意してください)。PropertyConfigurator.configure()DOMConfigurator.configure()

ここに私のサーブレットがあります:

public class Log4jInit implements Servlet {

@Override
public void destroy() {}

@Override
public ServletConfig getServletConfig() {return null;}

@Override
public String getServletInfo() {return null;}

@Override
public void init(ServletConfig arg0) throws ServletException {

    try{        
        DOMConfigurator.configure(getClass().getClassLoader().getResource("log4j.xml"));            
    }catch(Exception e){
        System.out.println("Log4jInit Exception : " + e);
    }

}

@Override
public void service(ServletRequest arg0, ServletResponse arg1)  throws ServletException, IOException {}

}

web.xmlまた、ファイルを変更することを忘れないでください:

<servlet>
    <servlet-name>Log4j Servlet</servlet-name>
    <servlet-class>your.package.Log4jInit</servlet-class>
    <load-on-startup> 1 </load-on-startup>
</servlet>

それだけです。

以前の log4j 構成を追加/オーバーライドする場合は、このコードを保持してください。

以前の構成をリセットする場合は、LogManager.resetConfiguration();前に追加しますLogManager.resetConfiguration(...);

于 2012-12-05T13:43:15.363 に答える