Spring 启动 log4j2 应用程序创建一个空的和一个工作日志文件
Spring Boot log4j2 application creates one empty and one working log file
假设我们有一个简单的 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{%d{ISO8601}}{black} %highlight{%-5level }[%style{%t}{bright,blue}] %style{%C{3.}}{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-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout>
<pattern>%d %p %C{3.} [%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 覆盖默认值 log4j2.xml =./log4j.xml 在服务的起始行。
但现在每次我启动服务时,它都会在服务的工作文件夹中创建一个文件夹结构“c:/tmp/.../logs/”,其中包含一个空 sw-b2b-data -service.log 里面的文件.
实际日志将转到覆盖 log4j2.xml 中定义的日志文件(类似于 %service's_root%/logs/sw-b2b-data-service.log).
我怎样才能摆脱创建的文件夹(和里面的空文件)?
当Spring开机启动时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 应用程序:
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{%d{ISO8601}}{black} %highlight{%-5level }[%style{%t}{bright,blue}] %style{%C{3.}}{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-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout>
<pattern>%d %p %C{3.} [%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 覆盖默认值 log4j2.xml =./log4j.xml 在服务的起始行。
但现在每次我启动服务时,它都会在服务的工作文件夹中创建一个文件夹结构“c:/tmp/.../logs/”,其中包含一个空 sw-b2b-data -service.log 里面的文件.
实际日志将转到覆盖 log4j2.xml 中定义的日志文件(类似于 %service's_root%/logs/sw-b2b-data-service.log).
我怎样才能摆脱创建的文件夹(和里面的空文件)?
当Spring开机启动时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 重新配置上下文就会被覆盖。