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

Posted

技术标签:

【中文标题】Log4j2 配置 - 找不到 log4j2 配置文件【英文标题】:Log4j2 configuration - No log4j2 configuration file found 【发布时间】:2014-10-18 16:11:39 【问题描述】:

最近我决定学习如何使用 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="%dHH:mm:ss.SSS [%t] %-5level %logger36 - %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>

我也尝试使用不带&lt;Logger&gt; 标签的xml、包规范和各种文件夹/包目录,但没有帮助。现在我的log4j2.xml 文件直接位于eclipse 的项目文件夹中。

【问题讨论】:

doc sais,它只需要在类路径上。是吗? 是的,我错过了。对不起,愚蠢的问题,谢谢:) 【参考方案1】:

这是一个没有 maven 等的简单 eclipse java 项目吗?在这种情况下,您需要将log4j2.xml 文件放在src 文件夹下,以便能够在类路径中找到它。 如果你使用 maven 把它放在src/main/resourcessrc/test/resources

【讨论】:

我的英雄!我在类路径中有配置文件(我认为),但它不在 src 文件夹中。我把它移到那里,它现在可以工作了! 如何配置 maven 项目? (就像 maven 方式,因为我想如果我在类路径下放一个 'log4j2.xml' 我会工作),谢谢你的提示:) log4j2.xml 在我的 src(没有 maven 的 JavaFX 项目)中,但没有找到.. 这太复杂了吗?!?! :( 对于sbtlog4j2.xml 也进入src/main/resources 我找不到这个文件 log4j2.xml【参考方案2】:

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

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

【讨论】:

-Dlog4j.configurationFile 是我所需要的,因为我正在从事的项目不是基于 Maven 的。太棒了【参考方案3】:

在使用 yaml 配置 log4j2 时遵循文档 - Apache Log4j2 Configuratoin 和 Apache Log4j2 Maven。根据文档,需要以下 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 的debugging configuration 方式有助于查看日志。后来不得不使用 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>

您可以参考MVN Repository 中log4j-api 版本项的Test Dependencies 部分添加版本。例如。对于 2.8.1 版本的 log4j-api,请参阅此 link 并找到 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 确实解决了我的问题【参考方案4】:

在您强制刷新 IDE 之前,Eclipse 永远不会看到文件。它的一个特点!因此,您可以将文件放在整个项目中,Eclipse 将完全忽略它并抛出这些错误。在 Eclipse 项目视图中点击刷新,然后它就可以工作了。

【讨论】:

【参考方案5】:

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

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

解决大部分配置问题。

详情见 Log4j2 常见问题:How do I debug my configuration?

【讨论】:

【参考方案6】:

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

【讨论】:

这表明项目无法识别包含您的配置的文件夹是资源文件夹,因此它不会在构建过程中自动复制文件。我建议您进一步研究一下,因为最终您将对不会复制到 bin 文件夹的源进行更改,并且最终会花费很长时间想知道为什么您的更改不起作用。

以上是关于Log4j2 配置 - 找不到 log4j2 配置文件的主要内容,如果未能解决你的问题,请参考以下文章

Log4j2 找不到使用 Spring Boot 的日志记录实现

Log4j2 在尝试启动 Sonar Qube 本地实例时找不到日志记录实现

Log4j2的正确使用姿势

如何在 IDE 中使用一个 log4j2 配置文件进行运行时,使用另一个 log4j2 配置文件进行打包/部署?

log4j2 配置简要分析

Log4j2配置