未找到 log4j2 配置文件.使用默认配置:仅将错误记录到控制台


$ java -Dlog4j.configuration=file:///path/to/your/log4j2.xml -jar /path/to/your/jar_file.jar

写入控制台,您将获得

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

但是,看起来配置文件也已找到并且不可解析:

    log4j:WARN Continuable parsing error 2 and column 31
    log4j:WARN Document root element "Configuration", must match DOCTYPE root "null".
    log4j:WARN Continuable parsing error 2 and column 31
    log4j:WARN Document is invalid: no grammar found.
    log4j:ERROR DOM element is - not a <log4j:configuration> element.
    log4j:WARN No appenders could be found for logger (kafka.utils.VerifiableProperties).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

问题 1

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

解决方案 1

使用 log4j 又名"log4j2"的版本 2

-Dlog4j.configuration=

应改为

-Dlog4j.configurationFile=
  • 1.2 手册:http://logging.apache.org/log4j/1.2/manual.html
  • 2.x 手册:http://logging.apache.org/log4j/2.x/manual/configuration.html

问题2

log4j:WARN ....

解决方案 2

在您的项目中,取消包含 log4j-1.2 jar,而是包含 log4j-1.2-api-2.1.jar。 我不确定如何准确排除log4j 1.2。 我知道我的项目的依赖性需要它。 所以,通过一些阅读,我排除了一堆东西。

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka_2.10</artifactId>
    <version>0.8.2.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>                
        </exclusion>
        <exclusion>
            <groupId>org.apache.log4j</groupId>
            <artifactId>log4j-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>          
    </exclusions>
</dependency>

我不确定哪个排除项起到了作用。另外,我包含了对 1.2 api 的依赖,该 api 桥接到 2.x。

<!--
    http://logging.apache.org/log4j/2.0/manual/migration.html
    http://logging.apache.org/log4j/2.0/maven-artifacts.html
    Log4j 1.x API Bridge
    If existing components use Log4j 1.x and you want to have this logging
    routed to Log4j 2, then remove any log4j 1.x dependencies and add the
    following.
-->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-1.2-api</artifactId>
    <version>2.2</version>
</dependency>

现在,只流向控制台的 1.2 日志实际上流向我们的 2.x 追加器。

如果你没有 log4j-1.2 的幸运.jar在你的类路径上,正如 Renko 在他的评论中指出的那样,你只会看到消息没有找到 log4j2 配置文件

如果您的配置文件中存在错误,这是一个问题,因为在启动时不会告诉您问题所在。

例如,如果您有一个 log4j2.yaml 文件,而 log4j2 无法处理,因为例如,您没有为项目配置 YAML 解析器,或者您的配置根本不正确。您将遇到找不到 log4j2 配置文件的消息,没有进一步的信息。即使您有一个有效的 log4j2.xml 文件,情况也是如此,因为 log4j2 只会尝试处理它找到的第一个配置文件。

我发现调试问题的最佳方法是根据上面提到的命令行参数显式声明您希望使用的配置文件。

-Dlog4j.configurationFile=

希望这将帮助您确定问题是否实际上是由于类加载器找不到 log4j2 配置文件或配置中的其他内容引起的。

更新

还可以使用以下属性更改状态记录器的默认级别以获取更多信息:

-Dorg.apache.logging.log4j.simplelog.StatusLogger.level=<level>

我遇到了同样的问题,但是在网上阅读有关此问题的信息后,我注意到我的项目中没有log4j2.xml,因此我将相关代码复制到记事本中并将记事本文件还原为XML并添加到文件夹资源下的项目中。 它对我有用。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration 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>
<Root level="DEBUG">
  <AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>

我已经处理这个问题一段时间了。我已经按照这篇文章中的描述更改了所有内容,甚至发生了错误。在这种情况下,请确保在更改.xml或 .properties 文件中的设置时清理项目。在日食环境中。选择 Project -> Clean

我在java maven项目中使用hive jdbc,并遇到了同样的问题。

我的方法是在src/main/java/resources下添加一个log4j2.xml文件

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyClassName {
    private static final Logger LOG = LoggerFactory.getLogger(MyClassName.class);
}

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration 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="<your_package_name>.<your_class_name>" level="debug">
        <AppenderRef ref="Console"/>
        </Logger>
        <Root level="WARN">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

确保在文件夹下放置了一个log4j2.*文件而不是log4j.*文件.../src/main/resources

我检查以验证日志记录的东西,

1( 检查是否没有较旧的 log4j 版本。

mvn dependency:tree | grep log ## ./gradlew dependencies | grep log
[INFO] +- com.prayagupd:log-service:jar:1.0:compile
[INFO] +- org.apache.logging.log4j:log4j-api:jar:2.6.2:compile
[INFO] +- org.apache.logging.log4j:log4j-core:jar:2.6.2:compile
[INFO] |  - commons-logging:commons-logging:jar:1.1.1:compile

2(确保我正确设置了log4j2.json,这是用-Dlog4j.configurationFile=???完成

val logConfig: PropertiesConfiguration = new PropertiesConfiguration("application.properties")
System.setProperty("log4j.configurationFile", logConfig.getString("log4j.config.file"))
println("log4j.configurationFile :: " + System.getProperty("log4j.configurationFile"))

Configurator.initialize(null, logConfig.getString("log4j.config.file"));

此外,如果发生自动检测确保文件名为 log4j2.* 而不是 log4j。

3(另一个检查是log4j2.json的解析器。感谢 log4j 团队没有在 API 中提供解析器。

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

如果找不到 json 解析器,这可能会引发异常

[Fatal Error] log4j2.json:1:1: Content is not allowed in prolog.

就我而言,我在 gradle 项目的类路径中使用了 log4j2 Json 文件log4j2.json,但我遇到了同样的错误。

这里的解决方案是将 JSON 处理的依赖项添加到我的 gradle 依赖项中。

compile group:"com.fasterxml.jackson.core", name:"jackson-core", version:'2.8.4'
compile group:"com.fasterxml.jackson.core", name:"jackson-databind", version:'2.8.4'
compile group:"com.fasterxml.jackson.core", name:"jackson-annotations", version:'2.8.4'

另请参阅 log4j2 的文档:

JSON

支持使用 Jackson 数据处理器来解析 JSON 文件。必须将这些依赖项添加到要使用的项目中 用于配置的 JSON:

我收到此错误,因为 log4j2 文件已从我的 src 文件夹中删除

只需在src文件夹下添加xml文件

<Appenders>
    <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" />
    </Console>
    <RollingFile name="RollingFile" filename="logs/B2CATA-hybrid.log"
        filepattern="${logPath}/%d{yyyyMMddHHmmss}-fargo.log">
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" />
        <Policies>
            <SizeBasedTriggeringPolicy size="100 MB" />
        </Policies>
        <DefaultRolloverStrategy max="20" />
    </RollingFile>
</Appenders>
<Loggers>
   <Logger name="com.pragiti." level="trace" />
    <Root level="info">
        <AppenderRef ref="Console" />
        <AppenderRef ref="RollingFile" />
    </Root>
</Loggers>

我正在研究TestNG Maven项目,通过在pom.xml中添加<resources>标签对我有用,这恰好是我的自定义配置文件log4j2.xml的路径。

<url>http://maven.apache.org</url>
<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<build>
  <resources>
    <resource>
      <directory>src/main/java/resources</directory>
      <filtering>true</filtering>
    </resource>
  </resources>
  <pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M3</version>
        <configuration>
          <suiteXmlFiles>
            <suiteXmlFile>testng.xml</suiteXmlFile>
          </suiteXmlFiles>
        </configuration>
      </plugin>
    </plugins>
  </pluginManagement>
</build>
<dependencies>
  <dependency>

xml 文件名重命名为 log4j2 后解决了该问题.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration 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>
<Root level="DEBUG">
  <AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
  1. 创建一个新的文本文档并复制粘贴上面的代码并将其保存为 log4j2.xml。

  2. 现在复制这个 log4j2.xml 文件并将其粘贴到 Java 项目的 src 文件夹下。

  3. 再次运行您的java程序,您将看到错误消失。

测试版本:log4j-ap 2.13.2,log4j-core 2.13.2。

  1. 将XML文件直接保存在下面的文件夹结构下。
  2. 在 POM 中:
    <build>   
 <resources>       
             <resource>
                <filtering>false</filtering>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>             
            </resource>
 </resources>  
</build>
  1. 清洁和构建。

2022 年 Intellij 用户的答案

如果您使用的是智能:

请按照以下步骤操作:

  1. 将"资源"文件夹放在"您的项目"根目录下,并将其标记为"资源根"。

  2. 将"log4j2.xml"放入资源文件夹

我已经通过配置构建路径解决了这个问题。以下是我遵循的步骤:在日食中。

  1. 创建一个文件夹并将 logj4 文件保存在其中。
  2. 在创建的文件夹中写入单击,然后转到"构建路径"。
  3. 点击添加文件夹
  4. 选择创建的文件夹。
  5. 单击确定并应用并关闭。

现在你应该能够运行了

这有时可以在 Web servlet 上找到的实际 log4j2 配置文件之前抛出。 至少就我而言,我是这么认为的。因为我的网络中已经有.xml

  <context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>classpath:log4j2-app.xml</param-value>
  </context-param>

并检查 log4j-web 源代码;在课堂上

org.apache.logging.log4j.web.Log4jWebInitializerImpl

有线;

String location = this.substitutor
                 .replace(this.servletContext.getInitParameter("log4jConfiguration"));

所有这些都让我认为这是找到配置之前的临时日志。

只需尝试以下步骤,它就会起作用,

  1. 将XML文件直接保存在下面的文件夹结构下。 src/main/java
  2. 确保保存pom.xml文件,以防进行任何更改。

最新更新