在JUnit测试类中的哪里配置log4j?


85

查看我编写的最后一个JUnit测试用例,我在类构造函数中调用了log4j的BasicConfigurator.configure()方法。对于仅运行Eclipse的“作为JUnit测试用例运行”命令中的单个类,该方法运行良好。但是我意识到这是不正确的:我很确定我们的主测试套件可以从一个进程运行所有这些类,因此log4j配置应该在某个地方进行。

但是我仍然需要自己单独运行一个测试用例,在这种情况下,我需要配置log4j。我应该在哪里放置配置调用,以便在测试用例独立运行时可以运行,而不是在作为较大套件的一部分运行测试用例时运行?


我要假设log4j 1.x在这里,而不是2 ...
rogerdpack '18

Answers:


50

所述LogManager类确定的log4j配置在一个使用静块被加载的类时运行。有三种面向最终用户的选项:

  1. 如果指定log4j.defaultInitOverride为false,则根本不会配置log4j。
  2. 自己手动指定配置文件的路径,并覆盖类路径搜索。您可以通过使用以下参数直接指定配置文件的位置java

    -Dlog4j.configuration=<path to properties file>

    在您的测试运行器配置中。

  3. 在测试期间,允许log4j扫描类路径中的log4j配置文件。(默认)

另请参见在线文档


怎么知道它是“ log4j配置文件”?文件名是什么?(log4j.xml?)
乍得

1
@Chad:我已经编辑了答案,以解决您的问题。请查看静态块的链接,以确切了解其实现方式。
保罗·莫里

我使用的是log4j2,我必须使用以下设置来指示文件:-Dlog4j.configurationFile=log4j2.xml。另外,如果您尝试调试加载/启动,则此设置可能很有用:-Dlog4j2.debug=true
肯特郡

有什么办法可以更具体地回答这个问题吗?
markthegrea

61

我通常只是将一个log4j.xml文件放入src / test / resources中,然后让log4j自己找到它:不需要任何代码,默认的log4j初始化将选择它。(我通常还是想将自己的记录器设置为“调试”)


6
对于标准建筑测试,我会将Log4j设置为警告甚至错误。如果测试成功(也包括否定测试),则不应记录日志,这会引起用户的注意。
keiki 2012年

2
是的,这对log4j 1.x是正确的。显然,对于log4j2,您可以使用更多的“异国”文件,例如log4j2-test.properties文件... logging.apache.org/log4j/2.x/manual/configuration.html :)
rogerdpack


5

我在log4j.xml中使用系统属性:

...
<param name="File" value="${catalina.home}/logs/root.log"/>
...

并开始测试:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.16</version>
    <configuration>
        <systemProperties>
            <property>
                <name>catalina.home</name>
                <value>${project.build.directory}</value>
            </property>
        </systemProperties>
    </configuration>
</plugin>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.