27

我目前正在开发一个使用 log4j 的项目。我正在运行一个测试用例(junit)并想将日志级别设置为跟踪,以便我可以查看所有值是否正确。在项目中使用日志记录的类包含如下一行:

private static final Log LOG = LogFactory.getLog(MatchTaskTest.class);

并使用这样的方式进行实际调试

LOG.trace("value");

我以前从未使用过 log4j,有人知道我如何仅为测试用例更改日志级别,最好只需在 eclipse 的运行配置对话框中定义一个参数。

4

7 回答 7

21

使用另一个配置文件

也许您可以指向另一个配置文件。

java -Dlog4j.configuration=config file yourApp

在哪里:

  • config,您的配置文件,例如log4j.propertieslog4j.xml.
  • file, 日志文件,例如myApp.log
  • yourApp,你的应用程序,例如MyAppGUI

或者你可以使用一个类

java -Dlog4j.configurationClass=config class yourApp

在哪里:

  • config,您的配置文件,例如log4j.propertieslog4j.xml.
  • class,任何自定义的初始化类,如LogManager,都应该实现org.apache.log4j.spi.Configurator
  • yourApp,你的应用程序,例如MyAppGUI

您可以在Apache log4j 1.2 - Default Initialization Procedure部分对 log4j的简短介绍中看到更多信息。

以编程方式修改关卡

此外,您还可以使用提供Logger类的方法public void setLevel(Level level),例如:

Logger.getRootLogger().setLevel(Level.TRACE);

由于您只想用于测试目的,您可以使用它们。但建议不要在客户端代码中使用,因为它们会覆盖硬编码中的默认配置参数。最好的方法是使用外部配置文件。

于 2012-05-17T23:35:58.580 回答
19

在你的junit类中放:

Logger.getRootLogger().setLevel(Level.TRACE);

在执行测试方法之前的某个地方。它将根记录器的阈值级别设置为 TRACE。

于 2012-05-17T23:38:18.027 回答
2

如果你使用 Maven,你可以有两个 log4j 配置文件:

  • 一个在 src/main/resources 中,包含您的生产日志配置
  • 一个在 src/test/resources 中,包含您的测试时日志配置

Maven 将在测试时自动使用后者,并将前者捆绑到您的工件(JAR、WAR 等)中,以便在生产中使用。您不必乱用命令行开关或任何东西。

于 2012-11-07T02:07:16.830 回答
0

我不认为这是可能的。

配置文件将让您配置日志中实际显示的日志消息,而不是每条消息要记录的级别。这是有道理的——配置不应影响消息的级别。

javadoc对每个日志级别都有一个方法和一个通用日志方法,它具有优先级,所以我不确定是否设置了默认值。

您可以通过 明确地在命令行上设置配置文件-Dlog4j.configuration=<FILE_PATH>,因此您可以为该测试用例设置特定的配置。

于 2012-05-17T23:18:15.690 回答
0

我不知道为什么上面的一些对我不起作用。(我不想写配置文件)。以下对我有用

Logger log1 = Deencapsulation.getField(Some.class,"logger");
log1.setLevel(Level.DEBUG);
于 2016-12-22T12:44:19.730 回答
0

注意 log4j2.properties 文件可能包含该行

filter.threshold.level = debug

您可能会浪费一整个下午来试图弄清楚为什么您的 LOG.trace() 语句没有输出任何内容!

于 2019-10-17T01:34:29.380 回答
-2

我实际上把它放在@Before 方法中。但我相信它可以(并且应该)放在@BeforeClass 中。

如果你在类体中设置它,你会得到编译器错误。

于 2013-05-15T22:18:07.973 回答