Как установить уровень журнала на DEBUG во время тестов Junit?

Я использую SLF4J с LOG4J, и конфигурации обычно находятся в log4j.properties, и он устанавливает уровень журнала в INFO.

Однако во время тестов я хотел бы установить журналы в DEBUG.

Я не могу найти способ автоматизировать это, ни иметь что-то вроде log4j.tests.properties которое было бы загружено только во время тестов.

Поэтому я попытался сделать это программно в тестовой настройке (@BeforeClass):

LogManager.getRootLogger().setLevel(Level.ALL);

Без успеха...

Я использую эти версии:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.5</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.5</version>
    </dependency>

Как я могу достичь этого результата?

EDIT: Я думаю, что я был недостаточно ясен. Этот вопрос заключается не в настройке правильного уровня журнала... Это касается установки уровня журнала DEBUG при запуске тестов Junit и установки уровня журнала INFO в любой другой ситуации. Я хочу автоматизировать это.

Ответ 1

Вам не нужно предоставлять JVM другую реализацию журнала.

Код регистрации выполняет log4j.properties файла log4j.properties с помощью пути к классам. Итак, все, что вам нужно сделать, это убедиться, что файл test log4j.properties находится в том месте, которое оно найдет перед файлом релиза.

Я использую Maven, который издает файлы в каталогах, чтобы сделать это легко. Мой выпуск log4j.properties отправляется в каталог src/main/resources. Моя тестовая версия входит в src/test/resources. Путь сборки Eclipse (путь к классам) настроен на поиск src/test/resources до src/main/resources, поэтому ваши модульные тесты используют тестовый файл. Инструкции сборки JAR (или WAR) используют файлы из src/main/resources.

Ответ 3

Вы можете использовать org.apache.logging.log4j.core.config.Configurator, у которого есть метод setAllLevels.

В своем тесте вы можете использовать его в методе @Before:

  @Before
  public void changeLogLevel() {
    Configurator.setAllLevels("", Level.ALL);
  }

ПРИМЕЧАНИЕ: протестировано с привязкой org.slf4j: slf4j-log4j12: 1.7.26

Ответ 4

Изменение уровня журнала ниже ROOT будет работать для junit, чтобы установить запись на желаемый уровень.

import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;

@Before
public void setUp() {
    final Logger logger = (Logger)LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
    logger.setLevel(Level.ALL);
}