Возможно ли подавление только предупреждений в Log4j2 при одновременном разрешении всех остальных - PullRequest
0 голосов
/ 22 мая 2019

Я использую log4j2 для записи сообщений в консоли и в файле.Я получаю много предупреждений, которые мне не нужны.Я только хочу видеть Отладку и другие сообщения.Можно ли подавить Warn-сообщения при разрешении Debug, Error и любых других типов сообщений?

Я смотрел здесь другие ответы о переполнении стека, но они говорят только о подавлении, которое подавляет все сообщения ниже, чтоопределенный уровень сообщения.Например, если я изменю свой уровень журнала на «Ошибка», я автоматически отключу Warn Debug и любые другие сообщения, которые находятся ниже этого уровня.Я не хочу такого поведения.Я хочу подавить только предупреждающие сообщения, разрешая любые сообщения ниже и выше этого уровня, если это возможноНиже приведен мой файл конфигурации Log2j2.

<Configuration status="error">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%d{DEFAULT}][%5p][%t][%c{1}] - %m%n" />
        </Console>
        <File name="MyFile" fileName="logs/java.log" immediateFlush="false" append="true">
            <PatternLayout pattern="[%d{DEFAULT}][%5p][%t][%c{1}] - %m%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" />
            <AppenderRef ref="MyFile"/>
        </Root>
    </Loggers>
</Configuration>

Ответы [ 2 ]

3 голосов
/ 25 мая 2019

Вы можете использовать LevelRangeFilter , чтобы отклонить события журнала.

Вот простой класс, который генерирует некоторые журналы:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class SomeClass {

    private static final Logger log = LogManager.getLogger();   

    public static void main(String[] args){

        if(log.isDebugEnabled())
            log.debug("This is some debug!");
        log.info("Here's some info!");
        log.warn("Warning will be rejected.");
        log.error("Some error happened!");
    }
}

Вот базовая конфигурация, которая просто отправляет все события на консоль:

<?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] %-5level %logger{36} - %msg%n" />
        </Console>
    </Appenders>

    <Loggers>
        <Root level="ALL">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

Вывод, генерируемый выше:

21:08:42.215 [main] DEBUG example.SomeClass - This is some debug!
21:08:42.217 [main] INFO  example.SomeClass - Here's some info!
21:08:42.217 [main] WARN  example.SomeClass - Warning will be rejected.
21:08:42.217 [main] ERROR example.SomeClass - Some error happened!

Теперь мы добавляем LevelRangeFilter к консольному приложению:

    <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        <LevelRangeFilter minLevel="WARN" maxLevel="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
    </Console>

Теперь вывод:

21:15:26.987 [main] DEBUG example.SomeClass - This is some debug!
21:15:26.989 [main] INFO  example.SomeClass - Here's some info!
21:15:26.989 [main] ERROR example.SomeClass - Some error happened!

Как видите, сообщение WARN не зарегистрировано на консоли.

1 голос
/ 22 мая 2019
Try threshold filters as follows:

<Configuration status="error">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
          <Filters>
                 <!-- Accept error and fatal messages -->
                 <ThresholdFilter level="error"  onMatch="ACCEPT"   onMismatch="NEUTRAL"/>

                 <!-- Reject Warn messages -->
                 <ThresholdFilter level="warn"  onMatch="DENY"   onMismatch="NEUTRAL"/>

                 <!-- This filter accepts debug, trace, info, error, fatal  -->
                 <ThresholdFilter level="trace"  onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>      
            <PatternLayout pattern="[%d{DEFAULT}][%5p][%t][%c{1}] - %m%n" />
        </Console>
        <File name="MyFile" fileName="logs/java.log" immediateFlush="false" append="true">
          <Filters>
                 <!-- Accept error and fatal messages -->
                 <ThresholdFilter level="error"  onMatch="ACCEPT"   onMismatch="NEUTRAL"/>

                 <!-- Reject Warn messages -->
                 <ThresholdFilter level="warn"  onMatch="DENY"   onMismatch="NEUTRAL"/>

                 <!-- This filter accepts debug, trace, info, error, fatal  -->
                 <ThresholdFilter level="trace"  onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>      
            <PatternLayout pattern="[%d{DEFAULT}][%5p][%t][%c{1}] - %m%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" />
            <AppenderRef ref="MyFile"/>
        </Root>
    </Loggers>
</Configuration>
...