Log4j2配置 - 未找到log4j2配置文件

97

最近我决定学习如何使用log4j2日志记录器。我下载了所需的jar文件,创建了库、xml配置文件,并尝试使用它。不幸的是,在控制台(Eclipse)中我看到了以下声明:

ERROR StatusLogger No log4j2 configuration file found. Using default configuration:       logging only errors to the console.

这是我的测试类代码:
package log4j.test;

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

public class Log4jTest
{
    static final Logger logger = LogManager.getLogger(Logger.class.getName());

    public static void main(String[] args) {    
        logger.trace("trace");
        logger.debug("debug");
        logger.info("info");
        logger.warn("warn");
        logger.error("error");
        logger.fatal("fatal");
    }
}

我的XML配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration package="log4j.test" 
               status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="log4j.test.Log4jTest" level="trace">
            <AppenderRef ref="Console"/>
        </Logger>
        <Root level="trace">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

我还尝试了使用没有<Logger>标签的xml文件,以及在不同的文件夹/包目录中使用包规范,但这些都没有帮助。现在我的log4j2.xml文件直接位于eclipse项目文件夹中。


2
文档中说,它只需要在类路径上。是吗? - Fildor
是的,我错过了。对于愚蠢的问题感到抱歉,谢谢 :) - Qbisiek
7个回答

148

这是一个简单的Eclipse Java项目,没有Maven等工具吗?如果是这样,您需要将log4j2.xml文件放置在src文件夹下,以便能够在类路径上找到它。 如果您使用Maven,请将其放置在src/main/resourcessrc/test/resources下。


5
我的英雄!我认为配置文件在类路径中,但它并不在src文件夹中。我把它移动到那里,现在它可以工作了! - Shadoninja
如何在Maven项目中进行配置?(像Maven的方式一样,因为我想如果我将'log4j2.xml'放在类路径下,它应该可以工作),感谢您的建议 :) - Enrique San Martín
1
log4j2.xml在我的src目录下(没有使用maven的JavaFX项目),但是它找不到了...这难道就这么复杂吗?! :( - Ewoks
2
对于sbtlog4j2.xml也放在src/main/resources中。 - Akavall
我找不到这个文件log4j2.xml。 - Karthiga
在我的情况下,我必须在此开始工作之前排除spring-boot-starter-logging模块。 - emirhosseini

35

你需要选择以下解决方案之一:

  1. 将log4j2.xml文件放置在项目的资源目录中,这样log4j将会在类路径下查找文件。
  2. 使用系统属性-Dlog4j.configurationFile=file:/path/to/file/log4j2.xml

1
"-Dlog4j.configurationFile" 是我所需的,因为我正在工作的项目不是基于Maven的。太棒了! - Kimchi Man

18

正在遵循文档 - Apache Log4j2配置Apache Log4j2 Maven 中使用yaml配置log4j2。根据文档,需要以下maven依赖项:

  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.8.1</version>
  </dependency>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.8.1</version>
  </dependency>

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <version>2.8.6</version>
</dependency>

只是添加这些东西并没有选择配置,总是出错。通过添加-Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACE的方式调试配置可以帮助查看日志。后来必须使用Maven下载源代码并进行调试,以了解log4j2所依赖的类。这些类在org.apache.logging.log4j.core.config.yaml.YamlConfigurationFactory中列出:

com.fasterxml.jackson.databind.ObjectMapper
com.fasterxml.jackson.databind.JsonNode
com.fasterxml.jackson.core.JsonParser
com.fasterxml.jackson.dataformat.yaml.YAMLFactory

添加依赖项映射jackson-dataformat-yaml不会有前两个类。因此,添加jackson-databind依赖项以使yaml配置工作:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.6</version>
</dependency>
您可以通过参考 log4j-api 版本项中的 Test Dependencies 部分,从 MVN Repository 中添加版本。例如,对于 log4j-api 的 2.8.1 版本,请参考此链接并查找 jackson-databind 版本。
此外,您可以使用以下 Java 代码来检查类是否在类路径中可用:
System.out.println(ClassLoader.getSystemResource("log4j2.yml")); //Check if file is available in CP
ClassLoader cl = Thread.currentThread().getContextClassLoader(); //Code as in log4j2 API. Version: 2.8.1
 String [] classes = {"com.fasterxml.jackson.databind.ObjectMapper",
 "com.fasterxml.jackson.databind.JsonNode",
 "com.fasterxml.jackson.core.JsonParser",
 "com.fasterxml.jackson.dataformat.yaml.YAMLFactory"};

 for(String className : classes) {
     cl.loadClass(className);
 }

谢谢。jackson-databind确实解决了我的问题。 - Sacky San

4

只有在强制刷新IDE之后,Eclipse才能看到文件。这是一个特性!所以您可以把文件放在项目的任何地方,Eclipse都会完全忽略它并抛出这些错误。在Eclipse项目视图中点击刷新,然后它就能正常工作了。


4

除了Tomasz W所写的内容之外,启动应用程序时您可以使用设置:

-Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACE 

为了解决大多数配置问题。

详情请参阅Log4j2常见问题解答:如何调试我的配置?


0

log4j-test.xml => 如果放在/test/resources下,则为配置文件的名称

     @TestPropertySource(properties = {
            "log4j.configurationFile","log4j-test.xml"
       })
     @CucumberContextConfiguration
     @ContextConfiguration(classes = TestConfiguration.class)
     public class Steps{
      private Logger log = LogManager.getLogger(Steps.class);

      //implementation
     }

0
在我的情况下,即使我的类路径设置为src文件夹,我仍然不得不将它放在项目的bin文件夹中。我不知道为什么,但值得一试。

这意味着该项目未能识别包含配置文件的文件夹为资源文件夹,因此在构建过程中不会自动复制该文件。我建议进一步研究此问题,因为最终您将对源代码进行更改,但更改不会被复制到 bin 文件夹中,最终会花费很长时间来想知道为什么更改没有生效。 - Sarah Phillips

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接