Как настроить log4j.properties для SpringJUnit4ClassRunner? - PullRequest
64 голосов
/ 31 декабря 2010

Внезапно это продолжает происходить во время теста 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.

Ответы [ 7 ]

72 голосов
/ 31 декабря 2010

В новых тестах, которые вы написали (прямо или косвенно), используются классы, которые регистрируют с помощью 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 Ведение журнала будет правильно настроено, и это предупреждение исчезнет.

48 голосов
/ 15 марта 2012

Если вы не хотите беспокоиться о файле, вы можете сделать что-то вроде этого в вашем коде:

static
{
    Logger rootLogger = Logger.getRootLogger();
    rootLogger.setLevel(Level.INFO);
    rootLogger.addAppender(new ConsoleAppender(
               new PatternLayout("%-6r [%p] %c - %m%n")));
}
8 голосов
/ 31 декабря 2010

Добавьте файл 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 голосов
/ 02 января 2011

У меня правильно настроены свойства log4j.properties.Это не проблема.Через некоторое время я обнаружил, что проблема была в Eclipse IDE, которая имела старую сборку в «кэше» и не создавала новую (проблема зависимости Maven).Мне пришлось строить проект вручную, и теперь он работает.

3 голосов
/ 21 марта 2013

Я использовал Maven в eclipse, и я не хотел иметь дополнительную копию файла свойств в корневой папке. Вы можете сделать следующее в Eclipse:

  1. Открыть диалоговое окно запуска (нажмите на маленькую стрелку рядом с кнопкой воспроизведения и перейдите к настройкам запуска)
  2. Перейти на вкладку "classpath"
  3. Выберите «Записи пользователя» и нажмите кнопку «Дополнительно» с правой стороны.
  4. Теперь выберите переключатель «Добавить внешнюю папку».
  5. Выберите папку ресурсов
2 голосов
/ 25 октября 2016

Поскольку мне не нравятся дубликаты файлов (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;
...
}
2 голосов
/ 02 мая 2016

Я знаю, что это старо, но у меня тоже были проблемы.Для Spring 3, использующего Maven и Eclipse, мне нужно было поместить log4j.xml в src / test / resources, чтобы модульный тест регистрировался правильно.Размещение в корне теста у меня не сработало.Надеюсь, это поможет другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...