如何在 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

其中&lt;id1&gt;&lt;id2&gt;&lt;id3&gt; 是您选择的字符串。它们对配置没有影响。

【讨论】:

你好@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 的查询?

Spring Boot中编写单元测试

Spring Boot Raw WebSocket 设置主体

无法在 Docker-Compose 中使用 Spring Boot 连接到 MongoDB