私はさまざまな環境でこれに遭遇しましたが、一貫した説明が見つかりませんでした。Tomcat コンテナーが「ごちゃごちゃ」しているというコメントを聞いたことがあります。ログの実装が異なる可能性があり、アプリまたはクラスローダーがどの構成を使用すればよいかわかりません。
これは、log4j.xml ファイルに変更を加えずに、ログ記録が一度機能し、その後 1 時間後にログ記録を行わないという非常に厄介なシナリオの 1 つです。/src ディレクトリのルートに log4j.xml ファイルがあるので、/WEB-INF/classes ディレクトリのルートにデプロイされます。私は Java 6、Tomcat 6 を使用しています。これは GWT 2.3 アプリであり、Windows 7 ボックスの Eclipse Helios 内から実行されます。
価値があるのは、log4j.xml です。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration>
<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE}
%5p %c{1}:%L - %m%n"/>
</layout>
</appender>
<appender name="fileAppender" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${catalina.home}/logs/log4j.log"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<param name="Append" value="true"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d
%-5p [%c{1}] %m %n" />
</layout>
</appender>
<root>
<priority value="debug"></priority>
<appender-ref ref="fileAppender"/>
</root>
</log4j:configuration>
ロギングを行っているクラスでロガーを取得する方法は次のとおりです
protected static Logger m_logger = Logger.getLogger(RemoteLoggingServiceImpl.class);
そして実際にログに記録するには
m_logger.debug("my log message");
上記のコードを使用すると、logj4.log ファイルに書き込まれません。
次に、次のことを試しました。これにより、log4j.log ファイルにログが記録されましたが、思ったように otherFile.log ファイルにはログが記録されませんでした。更新された log4j.xml ファイルは次のとおりです。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration>
<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE}
%5p %c{1}:%L - %m%n"/>
</layout>
</appender>
<appender name="fileAppender" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${catalina.home}/logs/log4j.log"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<param name="Append" value="true"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d
%-5p [%c{1}] %m %n" />
</layout>
</appender>
<appender name="otherFileAppender" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${catalina.home}/logs/otherFile.log"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<param name="Append" value="true"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d
%-5p [%c{1}] %m %n" />
</layout>
</appender>
<root>
<priority value="debug"></priority>
<appender-ref ref="fileAppender"/>
</root>
<logger name="com.mypackage.myLoggingClass">
<level value="debug"/>
<appender-ref ref="otherfileAppender"/>
</logger>
</log4j:configuration>
代わりにこれでこのロガーを作成します:
protected static Logger m_logger = Logger.getLogger("com.mypackage.myLoggingClass");
最初のシナリオでまったくログに記録されない理由、および/または 2 番目のシナリオで log4j.log に記録され、otherFile.log に記録されない理由を説明できる人はいますか?