使用XML文件(log4j2.xml)配置Log4j 2

时间:2012-11-05 15:34:53

标签: java eclipse log4j

我想使用新的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文件放在那里并将该文件夹添加到运行时类路径中

由于official website无法帮助我,我希望您可以帮我让Log4j 2使用我的配置文件。

7 个答案:

答案 0 :(得分:32)

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

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

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

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

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

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

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

根据您指定的配置,执行下面的代码会产生类似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");
    }
}

答案 1 :(得分:4)

提示: 要使用自定义log4j文件。 (而是默认&#34; log4j2.xml&#34; thingie)。在某些情况下使用多个配置可能很有用。

如果任何人使用maven并希望配置log4j2,以下是你需要的pom.xml:

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

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

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

-Dlog4j.configuration="Foo-log4j.xml"

答案 2 :(得分:1)

我的2美分:

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

我遇到了同样的问题,但是有了测试环境。

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

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

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");

    }
}

BTW,资源/可以放在测试包中,因此您不需要发送“test”log4j设置。

希望有所帮助

答案 3 :(得分:1)

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

log4j.configurationFile='xxxx/xxx/xxx'  

答案 4 :(得分:0)

eclipse用户的提示:

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

这里的答案如下: log4j 2 - configuration issue

答案 5 :(得分:0)

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

如果您在JEE服务器中,则可能需要将其放在“ jvm.options”文件中。如果它是罐子,只需使用-Dlog4j.debug运行Java。

答案 6 :(得分:-4)

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