Spring Boot log4j2 应用程序创建一个空日志文件和一个工作日志文件

Posted

技术标签:

【中文标题】Spring Boot log4j2 应用程序创建一个空日志文件和一个工作日志文件【英文标题】:Spring Boot log4j2 application creates one empty and one working log file 【发布时间】:2022-01-22 05:20:12 【问题描述】:

假设我们有一个简单的 Spring-boot 应用:

pom.xml

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <java.version>11</java.version>
        <log4j2.version>2.15.0</log4j2.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

<!-- other dependencies -->

    </dependencies>

log4j2.xml (src/main/resources/)

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout disableAnsi="false">
                <pattern>%style%dISO8601black %highlight%-5level [%style%tbright,blue] %style%C3.bright,yellow: %highlight[%p] %msg%n%throwable</pattern>
            </PatternLayout>
        </Console>

        <RollingFile name="RollingFile"
                     fileName="c:/tmp/sw-b2b-data-service/logs/sw-b2b-data-service.log"
                     filePattern="c:/tmp/sw-b2b-data-service/logs/$$date:yyyy-MM/sw-b2b-data-service-%dyyyy-MM-dd-%i.log.gz">
            <PatternLayout>
                <pattern>%d %p %C3. [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <SizeBasedTriggeringPolicy
                        size="4 MB" />
            </Policies>
        </RollingFile>
    </Appenders>

    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" />
            <AppenderRef ref="RollingFile" />
        </Root>

    </Loggers>

</Configuration>

我使用的是 Windows,所以 log4j2.xml 包含像“file...=c:/tmp/...”这样的行。

我通常使用相对路径来定位日志文件,但这次我决定将日志文件从项目文件夹中移出到一个临时目录。 现在,当我部署 jar 时,它包含 log4j2.xml 以及“BOOT-INF/classes”中的那些“file...=c:/tmp/...”行。

我认为该配置不会有问题,因为我们总是使用 -Dlogging.config=./log4j.xml 覆盖默认的 log4j2.xml服务的起始行。

但现在每次我启动服务时,它都会在服务的工作文件夹中创建一个文件夹结构“c:/tmp/.../logs/”,其中包含一个空的sw-b2b-data-service.log 里面的文件。

实际日志将转到覆盖 log4j2.xml 中定义的日志文件(类似于 %service's_root%/logs/sw-b2b-data-service.log em>)。

我怎样才能摆脱那些文件夹(和里面的空文件)的创建?

【问题讨论】:

【参考方案1】:

Spring Boot启动时Log4j配置两次:

一旦调用了一些LogManager.getLogger,Log4j 就会执行自动配置(参见Log4j documentation), 当 Spring 初始化其环境时,它会再次以编程方式配置 Log4j(请参阅 Spring documentation)。

在您的情况下,log4j2.xml 用于第一次配置 Log4j(并创建第一个文件),而 Spring 属性 logging.config 的值仅在第二次配置期间考虑。

要改变这种行为,你应该:

log4j2.xml重命名为log4j2-spring.xml,以便在第一次配置时不使用该文件(如果不指定logging.config,Spring将使用该文件), 或者,将系统属性log4j2.configurationFile 设置为新配置的位置。此设置将在第一次配置后生效,但一旦 Spring 重新配置上下文就会被覆盖。

【讨论】:

以上是关于Spring Boot log4j2 应用程序创建一个空日志文件和一个工作日志文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 应用程序中指定 Log4j2 配置文件

Spring Boot 应用系列 4 -- Spring Boot 2 整合log4j2

如何在 Spring Boot 中使用 Log4J2 复合配置

更改默认属性文件名时,带有 log4j2 的 Spring Boot 不起作用

在 Spring Boot 应用程序中未针对休眠和弹簧过滤 Log4j2 日志级别

在 Spring Boot 应用程序的 log4j2 中未生成日志文件