Как настроить log4j.properties для SpringJUnit4ClassRunner?
Внезапно это происходит во время теста JUnit. Все работало, я написал несколько новых тестов и эта ошибка возникла. Если я верну его, он не исчезнет. Почему это?
log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Ответы
Ответ 1
В новых тестах, которые вы написали (прямо или косвенно), используйте классы, которые регистрируются с помощью Log4j.
Log4J необходимо настроить для правильной работы этого журнала.
Поместите файл log4j.properties (или log4j.xml) в корень вашего пути к тестовому классу.
Он должен иметь некоторую базовую конфигурацию, такую как
# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
# An alternative logging format:
# log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n
Пользователь добавляет к консоли по умолчанию, но вы также можете явно указать цель следующим образом:
log4j.appender.A1.Target=System.out
Это перенаправит весь вывод в хорошем формате на консоль. Подробнее см. В Руководство Log4J,
Log4J Logging будет правильно настроен, и это предупреждение исчезнет.
Ответ 2
Если вы не хотите беспокоиться о файле, вы можете сделать что-то подобное в своем коде:
static
{
Logger rootLogger = Logger.getRootLogger();
rootLogger.setLevel(Level.INFO);
rootLogger.addAppender(new ConsoleAppender(
new PatternLayout("%-6r [%p] %c - %m%n")));
}
Ответ 3
Добавьте файл log4j.properties(log4j.xml) с хотя бы одним приложением в корневой каталог вашего пути к классам.
Содержимое файла (log4j.properties) может быть таким же простым, как
log4j.rootLogger=WARN,A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c %x - %m%n
Это позволит log4j вести журнал с уровнем журнала по умолчанию как WARN
и использовать консоль java для регистрации сообщений.
Ответ 4
У меня правильно настроены параметры log4j.properties. Это не проблема. Через некоторое время я обнаружил, что проблема была в Eclipse IDE, которая имела старую сборку в "кеш" и не создавала новую (проблема Maven dependecy). Мне пришлось строить проект вручную, и теперь он работает.
Ответ 5
Я использовал Maven в eclipse, и я не хотел иметь дополнительную копию файла свойств в корневой папке. Вы можете сделать следующее в eclipse:
- Откройте диалоговое окно запуска (щелкните маленькую стрелку рядом с кнопкой воспроизведения и перейдите к запускам конфигураций)
- Перейдите на вкладку "путь к классу"
- Выберите "Пользовательские записи" и нажмите кнопку "Дополнительно" с правой стороны.
- Теперь выберите переключатель "Добавить внешнюю папку".
- Выберите папку ресурсов
Ответ 6
Потому что мне не нравятся дубликаты файлов (log4j.properties в test и main), и у меня довольно много тестовых классов, каждый из них работает со словом SpringJUnit4ClassRunner, поэтому мне нужно его настроить. Это то, что я использую:
import java.io.FileNotFoundException;
import org.junit.runners.model.InitializationError;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.util.Log4jConfigurer;
public class MySpringJUnit4ClassRunner extends SpringJUnit4ClassRunner {
static {
String log4jLocation = "classpath:log4j-oops.properties";
try {
Log4jConfigurer.initLogging(log4jLocation);
} catch (FileNotFoundException ex) {
System.err.println("Cannot Initialize log4j at location: " + log4jLocation);
}
}
public MySpringJUnit4ClassRunner(Class<?> clazz) throws InitializationError {
super(clazz);
}
}
Когда вы его используете, замените SpringJUnit4ClassRunner на MySpringJUnit4ClassRunner
@RunWith(MySpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:conf/applicationContext.xml")
public class TestOrderController {
private Logger LOG = LoggerFactory.getLogger(this.getClass());
private MockMvc mockMvc;
...
}
Ответ 7
Я знаю, что это старо, но у меня тоже были проблемы. Для Spring 3 с использованием Maven и Eclipse мне нужно было поместить log4j.xml в src/test/resources для Unit test для правильного ведения журнала. Размещение в корне теста не помогло мне. Надеюсь, это поможет другим.