【问题标题】:Logback: Is it possible to combine the TimeBasedRollingPolicy with a SizeBasedTriggeringPolicy?Logback:是否可以将 TimeBasedRollingPolicy 与 SizeBasedTriggeringPolicy 结合使用?
【发布时间】:2019-02-15 22:22:56
【问题描述】:

我将 Logback 与 TimeBasedRollingPolicy 一起使用,每小时滚动一次文件:

<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>

在我的情况下,有时原始(尚未滚动)日志文件会变得非常大(几 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>

但随后出现错误,因为 %i 与 TimeBasedRollingPolicy 不兼容。

我也尝试了SizeAndTimeBasedRollingPolicy,但它只是将翻转的文件分块成更小的部分,而不查看原始日志文件的大小。

【问题讨论】:

    标签: logging logback rollingfileappender


    【解决方案1】:

    是否可以将 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>
    

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

    这是您的大小限制:&lt;maxFileSize&gt;1MB&lt;/maxFileSize&gt; 将其更改为 5GB,我已经用 1MB 测试过,但它适用于任何大小

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

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

    上述附加程序在使用时会给出以下输出:

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

    应该为您工作的 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-04
      • 2019-07-27
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 2015-01-02
      相关资源
      最近更新 更多