1

私はさまざまな環境でこれに遭遇しましたが、一貫した説明が見つかりませんでした。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 に記録されない理由を説明できる人はいますか?

4

3 に答える 3

1

まず、使用している Log4j のバージョンが記載されていないため、比較的新しいバージョンの Log4j を使用していると想定しています。

あなたが提供したサンプルコードの最初のブロックで:

    <root>
        <priority value="debug"></priority>
        <appender-ref ref="fileAppender"/>
    </root>

ルート アペンダーのログ レベルを変更していません。log4j 2.xのドキュメントによると

    構成ファイルが存在しない場合、logback はデフォルトで
    最小限のロギング環境をセットアップする DefaultConfiguration
    ルート ロガーに接続された ConsoleAppender で構成されます。出力
    パターンに設定された PatternLayout を使用してフォーマットされます
    "%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n".

    デフォルトでは、ルート ロガーが Level.ERROR に割り当てられていることに注意してください。

最初の例でロガーをファイルに出力するには、ルート ロガーを次のように変更する必要があります。

    <root level="debug">
        <appender-ref ref="fileAppender"/>
    </root>    

デフォルトのログ レベルが「エラー」に設定されていたため、コンソールに出力が表示されなかったことは、デバッグ ログが機能していなかったことを示す良い指標です。アプリケーションが実際にログを記録していることを確認できるように、ロガーにコンソール アペンダーを常備したいと思っています。

    <appender-ref ref="Console"/>

2 番目の例では、最初の例とまったく同じ理由で、ルート ロガーはファイルにログを記録しません。ただし、「com.mypackage.myLoggingClass」ロガーを正しく設定できたため、「com.mypackage.myLoggingClass」クラスベースのロガーを使用すると、アプリケーションにデバッグ出力が表示されます。

于 2012-12-14T01:08:01.147 に答える
0

私が見る限り、元の仮定はすべて正しく、ログを出力する必要があるため、この場合に確認するいくつかの点を以下に示します。

  • クラスパスを確認してください。競合を引き起こす他のログ ライブラリ jar をインポートしましたか (slf4j、common-logging など)。
  • インポートを確認してください。本当に org.apache.log4j.* でしたか。他のログ ライブラリではありません
  • gwt logging guideを確認してください。log4jと競合しますか?
  • log4j.log でファイル システムのロックを確認してください。他のプロセスがそれをロックしており、書き込みが失敗していませんか?
  • war/ear ファイルを確認してください。log4j.xml は本当に WEB-INF/classes に配置されていましたか?
  • ${catalina.home} が意図したパスに解決されることを確認します
于 2012-12-14T00:26:33.653 に答える