Подтвердить что ты не робот

Log4j: Почему корневой журнал собирает все типы журналов независимо от конфигурации?

У меня возникла проблема: даже если я укажу уровень в ERROR в корневом теге, указанный appender регистрирует все уровни (debug, info, warn) в файле независимо от настроек. Я не эксперт по log4j, поэтому любая помощь приветствуется.

Вот немного больше информации по теме:

  • Я проверил classpath для log4j.properties(нет ни одного), кроме log4j.xml

вот файл 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>

... и спасибо вам за советы: -)

4b9b3361

Ответ 1

Корневой регистратор находится в верхней части иерархии регистратора. Он исключителен тремя способами:

  • он всегда существует,
  • его уровень не может быть установлен в значение null
  • он не может быть восстановлен по имени.

rootLogger является отцом всех добавлений. Каждый включенный запрос на ведение журнала для данного регистратора будет перенаправлен всем добавителям в этом журнале, а также добавкам выше в иерархии (включая rootLogger)

Например, если app console добавлен в root logger, то все включенные запросы на ведение журнала будут не менее печатать на консоли. Если к регистратору добавляется добавление файла, скажем L, то запросы на ведение журнала для L и L's будут печататься в файле и на console. Можно переопределить это поведение по умолчанию, чтобы накопление appender больше не было аддитивным , установив флаг аддитивности на false.

Из руководства log4j

Подводя итог:

Если вы не хотите распространять событие регистрации на родительские журналы (например, rootLogger), добавьте флаг аддитивности в false в этих регистраторах. В вашем случае:

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

В стандартном стиле log4j config (который я предпочитаю XML):

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

Надеюсь, что это поможет.

Ответ 2

Запустите свою программу с помощью -Dlog4j.debug, чтобы стандартная информация не была проинформирована о настройке log4j. Я подозревал, что она не настроена так, как вы думаете.

Ответ 3

Чтобы добавить к тому, что сказал James AN Stauffer и cynicalman, я бы поспорил, что есть еще один файл log4j.xml/log4j.properties в вашем пути к классам, отличный от того, который вы хотите использовать, что приводит к тому, что log4j настраивается таким образом это.

-Dlog4j.debug является абсолютным способом убийства для устранения любых проблем с log4j.

Ответ 4

Две вещи: проверьте аддитивность и решите, хотите ли вы регистрировать события журнала, полученные более подробными уровнями ведения журнала, для распространения на корневой журнал.

Во-вторых, проверьте уровень корневого регистратора. Кроме того, вы также можете добавлять фильтрацию непосредственно к самому приложению, но это обычно не требуется.

Ответ 5

Если вы используете файл log4j.properties, обычно этот файл находится в корне вашего пути к классу, поэтому убедитесь, что он есть.

Ответ 6

Это правильное поведение. Корневой регистратор похож на поведение по умолчанию. Поэтому, если вы не укажете ни одного регистратора, он будет использовать уровень корневого регистратора как уровень по умолчанию, но это не означает, что уровень корневого регистратора является уровнем для всех ваших журналов.

Любой из вашего кода, который регистрируется с помощью журнала TraceLogger'logger или log. org.springframework.ws.server.endpoint.interceptor, будет регистрировать сообщения с использованием уровня TRACE и DEBUG, соответственно, любой другой код будет использовать корневой журнал для регистрации сообщения с использованием уровня, который находится в вашем случае ОШИБКА.

Поэтому, если вы используете логгер, отличный от root, уровень лог-журнала будет переопределен на этом уровне журнала регистрации. Чтобы получить желаемый результат, измените остальные два уровня журнала на ERROR.

Надеюсь, это полезно.