如何configurationSpringJUnit4ClassRunner的log4j.properties?

突然之间,这在JUnittesting期间不断发生。 一切正常,我写了一些新的testing,这个错误发生。 如果我恢复它,它不会消失。 这是为什么?

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. 

您(直接或间接)编写的新testing使用使用Log4j进行logging的类

需要configurationLog4J以使此日志logging正常工作。

log4j.properties (或log4j.xml)文件放入testing类path根目录中

它应该有一些基本的configuration,如

 # 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 

这会将所有输出以一种很好的格式redirect到控制台。 更多信息可以在这里findLog4J手册 ,

Log4J Logging然后将被正确地configuration,并且这个警告将消失。

如果你不想打扰一个文件,你可以在你的代码中这样做:

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

在类path的根目录中至less添加一个appender的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日志logging为WARN并使用java控制台logging消息。

我有正确configuration的log4j.properties。 这不是问题。 过了一段时间,我发现问题出在Eclipse IDE中,在“caching”中有一个旧版本,并没有创build一个新的(Maven依赖问题)。 我不得不手动build立项目,现在它工作。

我在eclipse中使用Maven,我不想在根文件夹中有一个额外的属性文件副本。 您可以在eclipse中执行以下操作:

  1. 打开运行对话框(点击播放button旁边的小箭头,进入运行configuration)
  2. 转到“类path”选项卡
  3. select“用户条目”,然后单击右侧的“高级”button。
  4. 现在select“添加外部文件夹”单选button。
  5. select资源文件夹

因为我不喜欢有重复的文件(在testing和主要log4j.properties),我有很多testing类,他们每个运行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); } } 

当你使用它时,用MySpringJUnit4ClassRunnerreplaceSpringJUnit4ClassRunner

 @RunWith(MySpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:conf/applicationContext.xml") public class TestOrderController { private Logger LOG = LoggerFactory.getLogger(this.getClass()); private MockMvc mockMvc; ... } 

我知道这是旧的,但我也有麻烦。 对于使用Maven和Eclipse的Spring 3,我需要将log4j.xml放在src / test / resources中以使Unittesting正确logging。 放入testing的根本不适合我。 希望这可以帮助别人。