Logback:是否可以将 TimeBasedRollingPolicy 与 SizeBasedTriggeringPolicy 结合起来?

sch*_*enk 1 logging logback rollingfileappender

我使用 LogbackTimeBasedRollingPolicy每小时滚动一次文件:

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <fileNamePattern>${serverpath}/logs/history-debug/debug.%d{yyyy-MM-dd_HH}.log.zip</fileNamePattern>
    <maxHistory>168</maxHistory> <!--7Days-->
    <totalSizeCap>2GB</totalSizeCap>
</rollingPolicy>
Run Code Online (Sandbox Code Playgroud)

有时,在我的情况下,原始(尚未滚动)日志文件可能会变得非常大(几个 GB)。我现在想SizeBasedTriggeringPolicy在配置中添加一个,以便在原始日志文件超过特定限制(例如 5GB)时额外滚动文件。因此,日志文件应该每小时滚动一次,除非文件变得很大,那么应该更早滚动。

我尝试过这个:

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <fileNamePattern>${serverpath}/logs/history-debug/debug.%d{yyyy-MM-dd_HH}.%i.log.zip</fileNamePattern>
    <maxHistory>168</maxHistory> <!--7Days-->
    <totalSizeCap>2GB</totalSizeCap>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
    <maxFileSize>5GB</maxFileSize>
</triggeringPolicy>
Run Code Online (Sandbox Code Playgroud)

但随后我收到错误,因为它%i与 TimeBasedRollingPolicy 不兼容。

我也尝试过,SizeAndTimeBasedRollingPolicy但它只将滚动的文件分成更小的部分,但不查看原始日志文件的大小。

sha*_*bby 5

是否可以将 TimeBasedRollingPolicy 与 SizeBasedTriggeringPolicy 结合起来?

是的,SizeAndTimeBasedRollingPolicy是适合您的解决方案。

<appender name="APPLICATION" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>D:/logs/log.txt</file>
    <append>true</append>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <Pattern>%p %d [%t] %L - %m%n</Pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <!-- rollover daily -->
        <fileNamePattern>D:/logs/log.%d{yyyy-MM-dd HH-mm}.%i.txt</fileNamePattern>
        <maxFileSize>1MB</maxFileSize>
        <!-- keep 30 days' worth of history -->
        <maxHistory>30</maxHistory>
        <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>
</appender>
Run Code Online (Sandbox Code Playgroud)

配置在原始日志文件超过一定限制(例如 5GB)时额外滚动文件

这是您的大小限制:<maxFileSize>1MB</maxFileSize>将其更改为 5GB,我已经用 1MB 进行了测试,但它适用于任何大小

因此,日志文件应该每小时滚动一次,除非文件变得很大,那么应该更早滚动。

如果我理解正确的话,你想根据最大尺寸或时间进行滚动,以先达到的为准。基于时间的滚动是通过以下方式实现的:{yyyy-MM-dd HH-mm}。这个每分钟滚动一次,如果你想每小时滚动一次,请使用:{yyyy-MM-dd HH}

上面的附加器在使用时会给出以下输出:

在此输入图像描述

您可以看到文件正在以最大大小 1MB 旋转,如果该大小在一分钟内达到,或者如果大小未达到但时间达到它仍然滚动(这在 files 和 中很log.2019-01-04 12-23.2.txt明显log.2019-01-04 12-24.3.txt

应该适合您的 logback.xml 是:

<?xml version="1.0" encoding="UTF-8"?>

<configuration>
    <!-- Send debug messages to System.out -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%p %d [%t] %L - %m%n</pattern>
        </encoder>
    </appender>
    <appender name="APPLICATION" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>D:/logs/log.txt</file>
        <append>true</append>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%p %d [%t] %L - %m%n</Pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- rollover daily -->
            <fileNamePattern>D:/logs/log.%d{yyyy-MM-dd HH}.%i.txt</fileNamePattern>
            <maxFileSize>5GB</maxFileSize>
            <!-- keep 30 days' worth of history -->
<!--            <maxHistory>30</maxHistory>
            <totalSizeCap>20MB</totalSizeCap>-->
        </rollingPolicy>
    </appender>

    <logger name="javaportreader" level="INFO" additivity="false">
        <appender-ref ref="STDOUT" />
    </logger>
    <logger name="application" level="DEBUG" additivity="false">
        <appender-ref ref="APPLICATION"/>
    </logger>

    <!-- By default, the level of the root level is set to DEBUG -->
    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
    </root>
    <root level="INFO">
        <appender-ref ref="APPLICATION"/>
    </root>
</configuration>
Run Code Online (Sandbox Code Playgroud)