Log4j: Почему корневой регистратор собирает все типы журналов независимо от конфигурации? - PullRequest
39 голосов
/ 17 сентября 2008

У меня проблема в том, что, хотя я указываю уровень для ОШИБКИ в корневом теге, указанный аппендер записывает в файл все уровни (отладка, информация, предупреждение) независимо от настроек. Я не эксперт по log4j, поэтому любая помощь приветствуется.

Вот еще немного информации по теме:

  • Я проверил путь к классам для 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>

... и спасибо вам, ребята, за подсказки: -)

Ответы [ 6 ]

72 голосов
/ 13 августа 2010

Корневой регистратор находится на вершине иерархии регистратора. Это исключительно в трех направлениях:

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

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

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

Из руководства пользователя 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

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

8 голосов
/ 18 сентября 2008

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

5 голосов
/ 18 сентября 2008

В дополнение к сказанному Джеймсом А. Н. Стауффером и циничным специалистом - я бы поспорил, что на вашем пути к классам есть другой log4j.xml / log4j.properties, отличающийся от того, который вы хотите использовать, который заставляет log4j самостоятельно настраивать путь это так.

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

4 голосов
/ 17 сентября 2008

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

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

2 голосов
/ 18 сентября 2008

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

0 голосов
/ 03 мая 2010

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

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

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

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

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