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

时间:2021-01-19 21:54:07

Lately I decided to learn how to use the log4j2 logger. I downloaded required jar files, created library, xml comfiguration file and tried to use it. Unfortunately i get this statement in console (Eclipse) :

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

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

This is my testing class code:

这是我的测试类代码:

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

And my xml config file:

我的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>

I tried also with xml without <Logger> tags, and package specification and in various folders/packages directories, but it didn't help. Now my log4j2.xml file is located directly in project folder in eclipse.

我也试过xml没有 标签,包规范和各种文件夹/包目录,但它没有帮助。现在我的log4j2.xml文件直接位于eclipse中的项目文件夹中。

6 个解决方案

#1


119  

Is this a simple eclipse java project without maven etc? In that case you will need to put the log4j2.xml file under src folder in order to be able to find it on the classpath. If you use maven put it under src/main/resources or src/test/resources

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

#2


24  

You need to choose one of the following solutions:

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

  1. Put the log4j2.xml file in resource directory in your project so the log4j will locate files under class path.
  2. 将log4j2.xml文件放在项目的资源目录中,以便log4j在类路径下找到文件。
  3. Use system property -Dlog4j.configurationFile=file:/path/to/file/log4j2.xml
  4. 使用系统属性-Dlog4j.configurationFile = file:/path/to/file/log4j2.xml

#3


5  

Was following the documentations - Apache Log4j2 Configuratoin and Apache Log4j2 Maven in configuring log4j2 with yaml. As per the documentation, the following maven dependencies are required:

遵循文档 - Apache Log4j2 Configuratoin和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>

and

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

Just adding these didn't pick the configuration and always gave error. The way of debugging configuration by adding -Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACE helped in seeing the logs. Later had to download the source using Maven and debugging helped in understanding the depended classes of log4j2. They are listed in org.apache.logging.log4j.core.config.yaml.YamlConfigurationFactory:

只是添加这些没有选择配置,总是给出错误。通过添加-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

Adding dependency mapping for jackson-dataformat-yaml will not have the first two classes. Hence, add the jackson-databind dependency to get yaml configuration working:

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

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.6</version>
</dependency>

You may add the version by referring to the Test Dependencies section of log4j-api version item from MVN Repository. E.g. for 2.8.1 version of log4j-api, refer this link and locate the jackson-databind version.

您可以通过参考MVN Repository中log4j-api版本项的Test Dependencies部分来添加版本。例如。对于log4j-api的2.8.1版本,请参考此链接并找到jackson-databind版本。

Moreover, you can use the below Java code to check if the classes are available in the classpath:

此外,您可以使用以下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);
 }

#4


3  

Eclipse will never see a file until you force a refresh of the IDE. Its a feature! So you can put the file all over the project and Eclipse will ignore it completely and throw these errors. Hit refresh in Eclipse project view and then it works.

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

#5


2  

Additionally to what Tomasz W wrote, by starting your application you could use settings:

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

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

to get most of configuration problems.

获得大多数配置问题。

For details see Log4j2 FAQ: How do I debug my configuration?

有关详细信息,请参阅Log4j2 FAQ:如何调试配置?

#6


1  

In my case I had to put it in the bin folder of my project even the fact that my classpath is set to the src folder. I have no idea why, but it's worth a try.

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

#1


119  

Is this a simple eclipse java project without maven etc? In that case you will need to put the log4j2.xml file under src folder in order to be able to find it on the classpath. If you use maven put it under src/main/resources or src/test/resources

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

#2


24  

You need to choose one of the following solutions:

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

  1. Put the log4j2.xml file in resource directory in your project so the log4j will locate files under class path.
  2. 将log4j2.xml文件放在项目的资源目录中,以便log4j在类路径下找到文件。
  3. Use system property -Dlog4j.configurationFile=file:/path/to/file/log4j2.xml
  4. 使用系统属性-Dlog4j.configurationFile = file:/path/to/file/log4j2.xml

#3


5  

Was following the documentations - Apache Log4j2 Configuratoin and Apache Log4j2 Maven in configuring log4j2 with yaml. As per the documentation, the following maven dependencies are required:

遵循文档 - Apache Log4j2 Configuratoin和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>

and

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

Just adding these didn't pick the configuration and always gave error. The way of debugging configuration by adding -Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACE helped in seeing the logs. Later had to download the source using Maven and debugging helped in understanding the depended classes of log4j2. They are listed in org.apache.logging.log4j.core.config.yaml.YamlConfigurationFactory:

只是添加这些没有选择配置,总是给出错误。通过添加-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

Adding dependency mapping for jackson-dataformat-yaml will not have the first two classes. Hence, add the jackson-databind dependency to get yaml configuration working:

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

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.6</version>
</dependency>

You may add the version by referring to the Test Dependencies section of log4j-api version item from MVN Repository. E.g. for 2.8.1 version of log4j-api, refer this link and locate the jackson-databind version.

您可以通过参考MVN Repository中log4j-api版本项的Test Dependencies部分来添加版本。例如。对于log4j-api的2.8.1版本,请参考此链接并找到jackson-databind版本。

Moreover, you can use the below Java code to check if the classes are available in the classpath:

此外,您可以使用以下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);
 }

#4


3  

Eclipse will never see a file until you force a refresh of the IDE. Its a feature! So you can put the file all over the project and Eclipse will ignore it completely and throw these errors. Hit refresh in Eclipse project view and then it works.

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

#5


2  

Additionally to what Tomasz W wrote, by starting your application you could use settings:

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

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

to get most of configuration problems.

获得大多数配置问题。

For details see Log4j2 FAQ: How do I debug my configuration?

有关详细信息,请参阅Log4j2 FAQ:如何调试配置?

#6


1  

In my case I had to put it in the bin folder of my project even the fact that my classpath is set to the src folder. I have no idea why, but it's worth a try.

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