【问题标题】:Set log4j log level设置 log4j 日志级别
【发布时间】:2012-05-17 23:09:37
【问题描述】:

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

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

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

LOG.trace("value");

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

【问题讨论】:

    标签: java logging log4j


    【解决方案1】:

    使用另一个配置文件

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

    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 - Short introduction to log4j 中查看更多信息。

    以编程方式修改关卡

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

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

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

    【讨论】:

    • 总是很好地添加:-Dlog4j.debug=true log4j:尝试使用上下文类加载器 sun.misc.Launcher$AppClassLoader@2876b359 查找 [log4j.xml]。 log4j:尝试使用 sun.misc.Launcher$AppClassLoader@2876b359 类加载器查找 [log4j.xml]。 log4j:尝试使用 ClassLoader.getSystemResource() 查找 [log4j.xml]。 log4j:尝试使用上下文类加载器 sun.misc.Launcher$AppClassLoader@2876b359 查找 [log4j.properties] log4j:使用 URL [file:/C:/ccccc/log4j.properties] 进行自动 log4j 配置。
    • 自 log4j 2 以来已更改。已删除 setLevel。
    【解决方案2】:

    在你的junit类中放:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 你有什么有用的链接可以像这样配置 Maven 吗?
      【解决方案4】:

      我认为这是不可能的。

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

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

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

      【讨论】:

        【解决方案5】:

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

        Logger log1 = Deencapsulation.getField(Some.class,"logger");
        log1.setLevel(Level.DEBUG);
        

        【讨论】:

          【解决方案6】:

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

          filter.threshold.level = debug
          

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-05-04
              • 2017-10-01
              • 1970-01-01
              • 2017-08-26
              • 2018-07-10
              • 2018-06-28
              • 1970-01-01
              • 2011-06-03
              相关资源
              最近更新 更多