41

ルートタグでレベルを 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>
4

6 に答える 6

76

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

  • それは常に存在し、
  • そのレベルを null に設定することはできません
  • 名前で検索することはできません。

rootLogger はすべてのアペンダーの父です。特定のロガーに対して有効になっている各ログ要求は、そのロガーのすべてのアペンダーと、階層の上位のアペンダー (rootLogger を含む) に転送されます。

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

log4jのマニュアルより

総括する:

ロギング イベントを親ロガー (rootLogger など) に伝播させたくない場合は、それらのロガーで加算フラグを 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

お役に立てれば。

于 2010-08-13T08:23:05.957 に答える
9

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

于 2008-09-17T20:12:37.820 に答える
6

James AN Stauffer と cynicalman が言ったことに追加するには、使用したいもの以外に別の log4j.xml / log4j.properties がクラスパスにあると思います。

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

于 2008-09-17T20:16:03.973 に答える
5

2つのこと:加法性をチェックし、より詳細なレベルのロギングによってキャプチャされたログイベントをルートロガーに伝播するかどうかを決定します。

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

于 2008-09-17T19:50:34.283 に答える
2

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

于 2008-09-17T21:03:33.797 に答える
0

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

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

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

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

于 2010-05-03T14:58:29.567 に答える