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

2022-08-31 13:27:42
$ 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

问题 1

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

解决方案 1

使用 log4j 的版本 2,又名“log4j2”

-Dlog4j.configuration=

应改为

-Dlog4j.configurationFile=

问题 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 追加器。


答案 2

如果你没有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>

推荐