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


91

最近,我决定学习如何使用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
DOC最高审计机关,它只是要在classpath。是吗?
Fildor 2014年

是的,我想念它。抱歉,我提出了愚蠢的问题并表示感谢:)
Qbisiek,2014年

Answers:


139

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


4
我的英雄!我在类路径中有配置文件(我认为),但是它不在src文件夹中。我将它移到那里,现在正在工作!
Shadoninja '16

如何使用Maven项目进行配置?(就像maven的方式一样,因为我想如果我将'log4j2.xml'放在类路径下也可以工作),谢谢提示:)
Enrique SanMartín17年

log4j2.xml位于我的src(不带maven的JavaFX Project)中,但是找不到。.这个复杂吗?!?!:(
Ewoks

2
对于sbtlog4j2.xml进入src/main/resources为好。
Akavall '17

我找不到此文件log4j2.xml
Karthiga

32

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

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

1
-Dlog4j.configurationFile这是我需要的,因为我正在从事的项目不是基于Maven的。太棒了
泡菜人

15

在使用yaml配置log4j2时遵循文档-Apache Log4j2 ConfiguratoinApache 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有助于查看日志。后来不得不使用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 RepositoryTest Dependencieslog4j-api版本项的部分来添加版本。例如,对于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);
 }


3

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


0

就我而言,我不得不将其放在项目的bin文件夹中,即使我的类路径已设置为src文件夹。我不知道为什么,但是值得一试。


这表明项目无法识别包含配置的文件夹是资源文件夹,因此它不会在构建过程中自动复制文件。我建议您对此进行进一步研究,因为最终您将对不会复制到bin文件夹的源进行更改,并且最终花了很多时间想知道您的更改为何不起作用。
莎拉·菲利普斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.