如何在 Spring Boot 应用程序中使用 log4j2 根据大小生成新的日志文件
Posted
技术标签:
【中文标题】如何在 Spring Boot 应用程序中使用 log4j2 根据大小生成新的日志文件【英文标题】:How to generate new log files based on size using log4j2 in spring boot application 【发布时间】:2022-01-22 05:51:09 【问题描述】:我正在使用 log4j2 生成一个日志文件,但是每次达到限制时我都需要根据大小生成一个新文件。
log4j2.properties 文件:
name=PropertiesConfig
property.filename =D:\\Users\\User\\MyFiles\\Apache Camel github\\ChatServiceProject\\logs\\propertieslogs.log
appenders = console, file
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %dyyyy-MM-dd HH:mm:ss.SSS [%t] %c1 - %msg%n
appender.file.type = File
appender.file.name = LOGFILE
appender.file.fileName=$filename
appender.file.layout.type=PatternLayout
appender.file.layout.pattern=[%-5level] %dyyyy-MM-dd HH:mm:ss.SSS [%t] %c1 - %msg%n
appender.file.append=true
appender.file=org.apache.log4j.RollingFileAppender
appender.fileLogger.MaxFileSize=1KB
loggers=file
logger.file.name=Processors
logger.file.level = trace
logger.file.appenderRefs = file
logger.file.appenderRef.file.ref = LOGFILE
rootLogger.level = trace
rootLogger.appenderRefs = stdout
rootLogger.appenderRef.stdout.ref = STDOUT
rootLogger= INFO, file, stdout
但是日志文件的大小现在是 16KB,它仍然没有生成新文件,而是将日志附加到同一文件中。所以我需要帮助来解决这个问题。 谢谢
【问题讨论】:
您的 appender 是File
appender,而不是 RollingFile
appender,因此它不执行轮换。
【参考方案1】:
以下属性可用于覆盖默认配置(application.properties)
logging.logback.rollingpolicy.max-index=10
logging.logback.rollingpolicy.max-file-size=15MB
spring 属性可以放在日志 xml 文件中。
<springProperty scope="context" name="MAX_INDEX" source="logging.logback.rollingpolicy.max-index"/>
<springProperty scope="context" name="MAX_FILE_SIZE" source="logging.logback.rollingpolicy.max-file-size"/>
样本:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<property name="LOG_FILE" value="$LOG_PATH:-$LOG_TEMP:-$java.io.tmpdir:-/tmp/e2e-tools.$nodename:-local.log"/>
<springProperty scope="context" name="MAX_INDEX" source="logging.logback.rollingpolicy.max-index"/>
<springProperty scope="context" name="MAX_FILE_SIZE" source="logging.logback.rollingpolicy.max-file-size" defaultValue="10MB"/>
<appender name="FIX_WINDOW_BASED_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>$LOG_FILE</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>$LOG_FILE.%i</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>$MAX_INDEX</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>$MAX_FILE_SIZE</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%dateISO8601 [%thread] %level: %msg%n</pattern>
</encoder>
</appender>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%dateISO8601 [%thread] %level: %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FIX_WINDOW_BASED_FILE"/>
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
【讨论】:
【参考方案2】:备注:Spring Boot 已经定义了一个带有旋转的日志文件(参见log4j2-file.xml
),其大小限制为 10 MiB(该限制是硬编码的)。你只需要设置:
logging.file.path=D:\\Users\\User\\MyFiles\\Apache Camel github\\ChatServiceProject\\logs
logging.file.name=propertieslogs.log
在您的application.properties
。
但是,如果您想编写自己的配置文件,则应考虑使用 XML 格式:
<Properties>
<Property name="LOG_PATH">D:\Users\User\MyFiles\Apache Camel github\ChatServiceProject\logs</Property>
<Property name="LOG_FILE">$sys:LOG_PATH/propertieslogs.log</Property>
</Properties>
<Appenders>
<RollingFile
name="LOGFILE"
append="true"
fileName="$sys:LOG_FILE"
filePattern="$sys:LOG_PATH/propertieslogs.%i.log.gz">
<PatternLayout pattern="[%-5level] %dyyyy-MM-dd HH:mm:ss.SSS [%t] %c1 - %msg%n" />
<SizeBasedTriggeringPolicy size="1 KB" />
</RollingFile>
</Appenders>
属性格式使用大量任意标识符来模拟 XML 的层次结构:
property.LOG_PATH=D:\Users\User\MyFiles\Apache Camel github\ChatServiceProject\logs
property.LOG_FILE=$sys:LOG_PATH/propertieslogs.log
appender.<id1>.type=RollingFile
appender.<id1>.name=LOGFILE
appender.<id1>.append=true
appender.<id1>.fileName=$sys:LOG_FILE
appender.<id1>.filePattern=$sys:LOG_PATH/propertieslogs.%i.log.gz
appender.<id1>.<id2>.type=PatternLayout
appender.<id1>.<id2>.pattern=[%-5level] %dyyyy-MM-dd HH:mm:ss.SSS [%t] %c1 - %msg%n
appender.<id1>.<id3>.type=SizeBasedTriggeringPolicy
appender.<id1>.<id3>.size=1 KB
其中<id1>
、<id2>
和<id3>
是您选择的字符串。它们对配置没有影响。
【讨论】:
你好@Piotr P. Karwasz,你说spring boot默认提供文件旋转,我怎样才能改变大小限制,每次使用spring boot的这个特性生成一个这个大小的新文件? 从我在答案中链接的log4j2-file.xml
文件中可以看出,您无法更改限制:它是硬编码的。但是,您可以将该文件复制到 log4j2-spring.xml
并进行修改。以上是关于如何在 Spring Boot 应用程序中使用 log4j2 根据大小生成新的日志文件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 spring boot + .yaml 创建配置文件?
spring-boot与spring-data-JPA的简单集成使用
Spring Boot 数据如何正确管理 NumberLong 的查询?