90

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

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

4

4 回答 4

63

我一般只是把 log4j.xml 文件放到 src/test/resources 中,让 log4j 自己找到:不需要代码,默认的 log4j 初始化会捡起它。(无论如何,我通常想将自己的记录器设置为“调试”)

于 2009-05-18T16:26:07.510 回答
52

该类确定在加载类时运行的静态块LogManager中使用哪个 log4j 配置。为最终用户提供了三个选项:

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

    -Dlog4j.configuration=<path to properties file>

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

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

另请参阅在线文档

于 2009-05-18T15:40:14.030 回答
6

您可能想要查看Simple Logging Facade for Java (SLF4J)。它是一个围绕 Log4j 的外观,不需要像 Log4j 这样的初始设置调用。为 Slf4j 切换 Log4j 也相当容易,因为 API 差异很小。

于 2009-05-18T16:07:21.587 回答
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>
于 2013-10-04T13:56:53.103 回答