2010-12-31 3 views
58

Внезапно это происходит во время теста JUnit. Все работало, я написал несколько новых тестов и эта ошибка возникла. Если я верну его, он не исчезнет. Почему это?Как настроить log4j.properties для SpringJUnit4ClassRunner?

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. 

ответ

66

Новые тесты вы написали (прямо или косвенно) использовать классы, лог с использованием 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 

к appender'у выводит на консоль по умолчанию, но вы также можете явно указать цель, как это:

log4j.appender.A1.Target=System.out 

Это будет перенаправлять все вывод в хорошем формате на консоль. Более подробную информацию можно найти здесь, в разделе Log4J manual,

Log4J Logging затем будет правильно настроен, и это предупреждение исчезнет.

+1

Просто для справки, вот ссылка для справки шаблона преобразования: HTTP: //logging.apache. org/log4j/1.2/apidocs/org/apache/log4j/EnhancedPatternLayout.html – lanoxx

+0

Можете ли вы объяснить, почему мы это делаем? – iLoveCamelCase

+0

project/src/test/resources/log4j.properties –

8

Добавьте файл 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, чтобы регистрировать сообщения.

3

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

+0

Привет, Том, не могли бы вы рассказать об этой проблеме и обходном пути - думаю, я тоже это переживаю! Спасибо – VLostBoy

+0

@vlostboy: а очистка проекта не помогла? – user219882

+0

@vlostboy: Решение, которое работало для меня, заключалось в его создании из командной строки: 'mvn clean package' – user219882

44

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

static 
{ 
    Logger rootLogger = Logger.getRootLogger(); 
    rootLogger.setLevel(Level.INFO); 
    rootLogger.addAppender(new ConsoleAppender(
       new PatternLayout("%-6r [%p] %c - %m%n"))); 
} 
+0

Сохранено в день! Спасибо @tster. –

3

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

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

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

2

Поскольку мне не нравятся дубликаты файлов (log4j.properties в тесте и 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; 
... 
} 
Смежные вопросы