web-dev-qa-db-ja.com

Log4j:ルートロガーが設定に関係なくすべてのログタイプを収集するのはなぜですか?

ルートタグでレベルをERRORに指定しても、設定に関係なく、指定されたアペンダーがすべてのレベル(デバッグ、情報、警告)をファイルに記録するという問題があります。私はlog4jの専門家ではありませんので、どんな助けも歓迎します。

この件に関するもう少し詳しい情報を次に示します。

  • Log4j.xmlを除き、log4j.propertiesのクラスパスを確認しました(なし)。

log4j.xmlファイルは次のとおりです。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.Apache.org/log4j/'>


    <!-- ============================== -->
    <!-- Append messages to the console -->
    <!-- ============================== -->


    <appender name="console" class="org.Apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out" />

        <layout class="org.Apache.log4j.PatternLayout">
            <!-- The default pattern: Date Priority [Category] Message\n -->
            <param name="ConversionPattern" value="[AC - %5p] [%d{ISO8601}] [%t] [%c{1} - %L] %m%n" />
        </layout>
    </appender>

    <appender name="logfile" class="org.Apache.log4j.RollingFileAppender">
        <param name="File" value="./logs/server.log" />
        <param name="MaxFileSize" value="1000KB" />
        <param name="MaxBackupIndex" value="2" />
        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[AC - %-5p] {%d{dd.MM.yyyy - HH.mm.ss}} %m%n" />
        </layout>
    </appender>

    <appender name="payloadAppender" class="org.Apache.log4j.RollingFileAppender">
        <param name="File" value="./logs/payload.log" />
        <param name="MaxFileSize" value="1000KB" />
        <param name="MaxBackupIndex" value="10" />
        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[AC - %-5p] {%d{dd.MM.yyyy - HH.mm.ss}} %m%n" />
        </layout>
    </appender>

    <appender name="errorLog" class="org.Apache.log4j.RollingFileAppender">
        <param name="File" value="./logs/error.log" />
        <param name="MaxFileSize" value="1000KB" />
        <param name="MaxBackupIndex" value="10" />
        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[AC - %-5p] {%d{dd.MM.yyyy - HH.mm.ss}} %m%n" />
        </layout>
    </appender>

    <appender name="traceLog"
        class="org.Apache.log4j.RollingFileAppender">
        <param name="File" value="./logs/trace.log" />
        <param name="MaxFileSize" value="1000KB" />
        <param name="MaxBackupIndex" value="20" />

        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="[AccessControl - %-5p] {%t: %d{dd.MM.yyyy - HH.mm.ss,SSS}} %m%n" />
        </layout>
    </appender>

    <appender name="traceSocketAppender" class="org.Apache.log4j.net.SocketAppender">
        <param name="remoteHost" value="localhost" />
        <param name="port" value="4445" />
        <param name="locationInfo" value="true" />
    </appender>

    <logger name="TraceLogger">
        <level value="trace" /> <!-- Set level to trace to activate tracing -->
        <appender-ref ref="traceLog" />     
    </logger>

    <logger name="org.springframework.ws.server.endpoint.interceptor">
        <level value="DEBUG" />
        <appender-ref ref="payloadAppender" />
    </logger>

    <root>
        <level value="error" />
        <appender-ref ref="errorLog" />
    </root>

</log4j:configuration>

ルートを別のロガーに置き換えると、指定されたアペンダーには何も記録されません。

<logger name="com.mydomain.logic">
    <level value="error" />
    <appender-ref ref="errorLog" />
</logger>

...そしてこれまでのヒントをありがとうございます:-)

40
Petr Macek

ルートロガーはロガー階層の最上部にあります。次の3つの点で例外的です。

  • 常に存在します
  • レベルをnullに設定することはできません
  • 名前で取得することはできません。

rootLoggerはすべてのアペンダーの父です。特定のロガーで有効になっている各ロギングリクエストは、そのロガーのすべてのアペンダーおよび階層の上位のアペンダー(rootLoggerを含む)に転送されます

たとえば、consoleアペンダーがroot loggerに追加された場合、すべての有効なロギングリクエストは少なくともコンソールに出力されます。さらに、ファイルアペンダーがロガーに追加された場合(Lなど)、LおよびL'sの子のログ要求を有効にすると、ファイルに出力されますand = consoleで。このデフォルトの動作をオーバーライドして、アペンダーの累積が加算的でなくなるようにすることができます加算性フラグをfalseに設定することにより

log4jマニュアルから

総括する:

ロギングイベントを親ロガー(rootLoggerなど)に伝搬させたくない場合は、それらのロガーでadditivityフラグをfalseに追加します。あなたの場合:

<logger name="org.springframework.ws.server.endpoint.interceptor"
        additivity="false">
        <level value="DEBUG" />
        <appender-ref ref="payloadAppender" />
</logger>

標準のlog4j構成スタイル(私はXMLを好む):

log4j.logger.org.springframework.ws.server.endpoint.interceptor = INFO, payloadAppender
log4j.additivity.org.springframework.ws.server.endpoint.interceptor = false

お役に立てれば。

74
monzonj

-Dlog4j.debugを使用してプログラムを実行し、標準出力がlog4jの構成に関する情報を取得するようにします。

James A. N. Staufferとcynicalmanが言ったことに追加するために-使用したいクラスパス以外にlog4j.xml/log4j.propertiesがあり、それがlog4jの設定をそのままにしているのは間違いないでしょう。

-Dlog4j.debugは、log4jの問題をトラブルシューティングする絶対的な方法です。

6
matt b

2つのこと:加算性を確認し、より詳細なレベルのログでキャプチャされたログイベントをルートロガーに伝達するかどうかを決定します。

次に、ルートロガーのレベルを確認します。さらに、アペンダー自体にフィルタリングを追加することもできますが、通常これは必要ありません。

5

log4j.propertiesファイルを使用している場合、このファイルは通常、クラスパスのルートにあることが予想されるため、そこにあることを確認してください。

2
Michael

これは正しい動作です。ルートロガーはデフォルトの動作に似ています。したがって、ロガーを指定しない場合、デフォルトレベルとしてルートロガーレベルが使用されますが、これはルートロガーレベルがすべてのログのレベルであることを意味するものではありません。

'TraceLogger'loggerまたは' org.springframework.ws.server.endpoint.interceptor 'ロガーを使用してログを記録するコードは、それぞれTRACEおよびDEBUGレベルを使用してメッセージを記録します。他のコードは、レベルを使用してメッセージを記録するためにルートロガーを使用します。あなたの場合はエラー。

したがって、ルート以外のロガーを使用する場合、ルートログレベルはそのロガーのログレベルによって上書きされます。目的の出力を取得するには、他の2つのログレベルをERRORに変更します。

これがお役に立てば幸いです。

0
JCaptain