27

我想使用新的 Log4J 2 - Java Logging Framework。一切正常,但我尝试了一个小时后加载自定义配置文件来配置日志记录(如日志级别)。

这是我的 log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
  <appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
  </appenders>
  <loggers>
    <root level="error">
      <appender-ref ref="Console"/>
    </root>
  </loggers>
</configuration>

我尝试了以下方法,但没有任何效果:

  • 移动 log4j2.xml 文件,使其位于默认包中。
  • 将 log4j2.xml 文件移动到项目中的任何位置
  • 将 log4j2.xml 文件命名为“log4j.xml”
  • 在您的项目中创建一个文件夹,将您的 log4j2.xml 文件放在那里并将该文件夹添加到您的运行时类路径

由于官方网站无法帮助我,我希望你能帮助我让 Log4j 2 与我的配置文件一起工作。

4

7 回答 7

36

重要提示:确保配置文件的名称是log4j2.xml(注意2句号之前)而不是log4j.xml

我的猜测是什么都没有发生,因为没有使用错误级别记录任何内容。您可能想尝试添加另一个记录器,如下所示:

<logger name="com.foo.Bar" level="trace">
  <appender-ref ref="Console"/>
</logger>

看起来配置部分可能是一个很好的资源。

为了进一步详细说明,您指定了一个级别设置为“错误”的记录器:

<root level="error">
  <appender-ref ref="Console"/>
</root>

这意味着只有使用 Level.ERROR 记录的消息才会显示在日志中。添加具有较少限制级别的记录器将允许更多消息出现在日志中。我建议您查看手册的架构部分(如果您向下滚动页面,您将看到解释日志级别的表格)。或者,您可以将根记录器的级别更改为跟踪(而不是添加新记录器)

给定您指定的配置,执行下面的代码会产生类似13:27:50.244 [main] ERROR com.example.Log4j2Tester - testing ERROR level

package com.example;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Log4j2Tester {
    private static final Logger LOG = LogManager.getLogger(Log4j2Tester.class);

    public static void main(String[] args) {
        LOG.error("testing ERROR level");

//if you change the level of root logger to 'trace'
//then you'll also see something like
//    13:27:50.244 [main] TRACE com.example.Log4j2Tester - exiting application
        LOG.trace("exiting application");
    }
}
于 2012-11-05T15:59:49.937 回答
3

提示:使用自定义 log4j 文件。(而不是默认的“log4j2.xml”东西)。在某些情况下,拥有多种配置可能很有用。

以防万一有人使用 maven 并希望配置 log4j2,以下是您在 pom.xml 中需要的内容:

                <systemProperties>
                    <property>
                        <name>/log4j.configuration</name>
                        <value>.../../Foo-log4j.xml</value>
                    </property>
                </systemProperties>

默认情况下,“log4j2.xml”是预期的文件名。但是,我们可以通过设置 log4j.configuration 系统属性来覆盖它。在上面的示例中,我使用了自定义配置文件作为“Foo-log4j.xml”。

您可以通过 CLI 执行相同操作:

-Dlog4j.configuration="Foo-log4j.xml"
于 2015-05-08T21:13:57.337 回答
2

除了使用类路径根文件夹中的默认配置文件log4j2.xml(或log4j2-test.xml)外,还可以使用该系统属性指定配置文件路径(在java命令行中使用-D)

log4j.configurationFile='xxxx/xxx/xxx'  
于 2013-10-08T15:29:36.753 回答
1

我的 2 美分:

软件系统:log4j 2、NetBeans 和 TestNG。

我有同样的问题,但测试环境。

默认情况下,(即在位于 src/ 的 log4j2.xml 文件中)日志记录级别设置为错误。但是在运行测试时,我希望记录是跟踪的。而且,当然记录到一些或多或少的硬编码文件。

也就是说,最初我做了类似的事情:

public class someTestClass {
       static final Logger log=LogManager.getLogger("test.someTestClass");
......
@Test
public void SomeMethod(){

System.setProperty("log4j.configurationFile", "resources/log4j2_conf.xml");

log.trace("This will not show because the default logging level is ERROR
and the resources/log4j2_conf.xml is not loaded");

}

问题是在执行System.setProperty指令的时候,log4j已经设置好了(也就是先执行静态的最终Logger log =...)

我所做的是像这样使用@BeforeClass:

 public class someTestClass {
    Logger log;      
    @BeforeClass
    public void setLogger(){
        SetEnv.SetEnvironment();
        log = LogManager.getLogger("TestRealClientRealServer");
    }
......
    @Test
    public void SomeMethod(){

        log.trace("This will show, because in log4j2_conf.xml
 the root level is set to TRACE");

    }
}

顺便说一句,resources/ 可以放在测试包中,这样您就不会发布“测试”log4j 设置。

希望能帮助到你

于 2013-08-15T18:15:10.090 回答
0

给 Eclipse 用户的提示:

右键单击项目,然后单击“刷新”。确保您可以在 Eclipse 中看到 log4j2.xml 文件。

完整答案在这里: log4j 2 - 配置问题

于 2013-11-09T11:50:25.603 回答
0

这对于解决“如果正在读取日志 conf 文件我不”问题更有价值。使用选项启动您的 jvm -Dlog4j.debug。当它启动时,它将打印它尝试读取的所有日志配置文件。它会一一列出。最后显示的是系统使用的那个。

如果您在 JEE 服务器中,您可能需要将它放在某处的“jvm.options”文件中。如果它是一个 jar,只需使用 -Dlog4j.debug 运行 java。

于 2019-04-05T20:50:54.710 回答
-4

LOG4J2.XML放在项目的根文件夹src/main中。

于 2013-05-20T00:37:07.053 回答