繁体   English   中英

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

[英]Log4j2 configuration - No log4j2 configuration file found

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

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

这是我的测试 class 代码:

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 和 package 规范以及各种文件夹/包目录,但没有帮助。 现在我的log4j2.xml文件直接位于 eclipse 的项目文件夹中。

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

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

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

正在关注文档 - Apache Log4j2 ConfiguratoinApache 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>

您可以通过参考MVN Repositorylog4j-api版本项的Test Dependencies部分来添加版本。 例如,对于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);
 }

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

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

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

获得大多数配置问题。

有关详细信息,请参阅Log4j2常见问题解答: 如何调试配置?

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

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
     }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM