Отключить вывод log4j во время модульных тестов

Общепринятой практикой является получение регистраторов через static- factory (хотя он полностью нарушает принцип DI). И на самом деле это прекрасно, если вы не хотите полностью избавиться от регистрации. во время выполнения модульных тестов.

Мне удалось отключить log4j logging, используя следующее заклинание:

 List<Logger> loggers = Collections.<Logger>list(LogManager.getCurrentLoggers());
 loggers.add(LogManager.getRootLogger());
 for (Logger logger : loggers) {
     logger.setLevel(Level.OFF);
 }

Вначале он печатает некоторую информацию о настройке на консоли:

log4j: reset attribute= "false".
log4j: Threshold ="null".
log4j: Retreiving an instance of org.apache.log4j.Logger.
log4j: Setting [test] additivity to [false].
log4j: Level value for test is  [DEBUG].
...

Как отключить его, программно, при запуске пакета unit-test?

Ответ 1

Возможно, вы включили внутренний журнал log4j в вашем файле log4j.properties или log4j.xml.

Log4j использует класс, называемый LogLog, чтобы выполнять эти внутренние вызовы ведения журнала. Вы можете отключить вывод LogLog, вызвав LogLog.setQuietMode(true). Это необходимо установить перед первым вызовом log4j, который инициирует инициализацию. Обратите внимание, однако, что setQuietMode() не только отключает вывод отладки, но также и предупреждения.

Поэтому я рекомендую вам использовать отдельную конфигурацию ведения журнала для своих тестов. Raedwald рассказал, как это сделать в ответе , с которым они связаны.

Вот пример файла log4j.xml, который вы можете использовать. Обратите внимание на свойство debug="false". Однако не обязательно устанавливать это значение, поскольку значение по умолчанию false.

Если вы используете maven, поместите файл в src/test/resources, который гарантирует, что этот файл будет получен для тестов вместо основного файла конфигурации.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="false" xmlns:log4j='http://jakarta.apache.org/log4j/'>

    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
        </layout>
    </appender>

    <root>
        <level value="OFF"/>
        <appender-ref ref="console"/>
    </root>

</log4j:configuration>

Это эквивалентный файл log4j.properties:

log4j.debug=false

log4j.rootLogger=OFF, console

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n