Почему два регистратора не разделяют сообщения в соответствии с их уровнями в Log4j? - PullRequest
0 голосов
/ 19 сентября 2019

Я хочу записать все уровни логгера в файл (FATAL-> ALL) и одновременно показать уровень ОШИБКИ и выше в консоли.Я использую root logger для записи всех уровней в файл и отдельный logger для записи уровня ERROR на консоль.Мой XML-файл конфигурации выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout
                    pattern="%d{HH:mm:ss.SSS} [%t] %highlight{%level}{FATAL=bg_red, ERROR=red, WARN=yellow, INFO=blue} %logger{36} - %msg%n" disableAnsi="false"/>
        </Console>

        <File name="File" fileName="output.log" bufferedIO="true" >
            <PatternLayout
                    pattern="%d{HH:mm:ss.SSS} [%t] %highlight{%level}{FATAL=bg_red, ERROR=red, WARN=yellow, INFO=blue} %logger{36} - %msg%n"/>
        </File>
    </Appenders>

    <Loggers>
        <Root level="ALL">
            <AppenderRef ref="File"/>
        </Root>

        <Logger name="com.danielk" level="ERROR">
            <AppenderRef ref="Console"/>
        </Logger>

    </Loggers>
</Configuration>

Я ожидал, что в файле будут все уровни ведения журнала и только уровень «Ошибка» и выше, но у меня есть только уровни «Ошибка» на обоих (консоль и файл):

23: 19: 54.422 [main] ОШИБКА com.danielk.Example - ошибка с ошибкой в ​​примере 23: 19: 54.434 [main] ОШИБКА com.danielk.Main - ОШИБКАERROR ERROR FROM MAIN

Сами сообщения построены правильно, потому что, когда я устанавливаю оба регистратора (Root и дополнительные) на уровень «ALL», я вижу все виды сообщений (не только уровень «Error»).

Что нужно сделать, чтобы разделить уровни:

  1. Файл - все уровни
  2. Консоль - только ошибки и выше?

1 Ответ

1 голос
/ 20 сентября 2019

Вы можете использовать ThresholdFilter на консоли приложения для фильтрации событий журнала, которые имеют ERROR или более определенный уровень (https://logging.apache.org/log4j/2.x/manual/filters.html#ThresholdFilter).

Полная конфигурация, например:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout
                    pattern="%d{HH:mm:ss.SSS} [%t] %highlight{%level}{FATAL=bg_red, ERROR=red, WARN=yellow, INFO=blue} %logger{36} - %msg%n"
                    disableAnsi="false"/>
            <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
        </Console>
        <File name="File" fileName="output.log" bufferedIO="true" append="false">
            <PatternLayout
                    pattern="%d{HH:mm:ss.SSS} [%t] %highlight{%level}{FATAL=bg_red, ERROR=red, WARN=yellow, INFO=blue} %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="File"/>
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

PSКогда вы указываете:

<Logger name="com.danielk" level="ERROR">
   <AppenderRef ref="Console"/>
</Logger>

, тогда уровень журнала устанавливается на ERROR для всех подпакетов и классов внутри com.danielk (если вы не настроите более конкретный регистратор, скажем com.danielk.db.MyClass с другим уровнем)Поэтому в файле журнала появились только ошибки.

...