logback 中的 MaxBackupIndex

MaxBackupIndex in logback

我有一个java项目 我使用 Logback 作为日志记录框架而不是 log4j 项目。 Logback 的架构足够通用,可以适用于不同的情况。 我有这个 logback.xml 文件,预计同时不超过 10 个日志文件,但事实并非如此

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

    <property name="DEV_HOME" value="" />

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
            </Pattern>
        </layout>
    </appender>

    <appender name="FILE-AUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>Calzada.log</file>
        <encoder>
            <pattern>%d{"yyyy-MM-dd HH:mm"} [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover daily -->
            <fileNamePattern>ATrackAT1Handler.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <minIndex>1</minIndex>
            <maxIndex>10</maxIndex>
            <maxHistory>10</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10KB</maxFileSize>

            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>     
    </appender>

    <appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>CalzadaError.log</file>
        <encoder>
            <pattern>%d{"yyyy-MM-dd HH:mm"} [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover daily -->
            <fileNamePattern>ATrackAT1HandlerError.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10KB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>     
    </appender>



    <logger name="com.calzada" level="debug"
        additivity="false">
        <appender-ref ref="FILE-AUDIT" />
        <appender-ref ref="STDOUT" />
    </logger>

   <root level="error">
        <appender-ref ref="FILE-ERROR" />
    </root>

</configuration> 

我认为您的配置混淆了 Logback 策略。

在您的配置中您使用:TimeBasedRollingPolicy 然后尝试设置 minIndexmaxIndex 但这些配置属性在 TimeBasedRollingPolicy 上不可用,相反它们是FixedWindowRollingPolicy.

的属性

请参阅 TimeBasedRollingPolicy and FixedWindowRollingPolicy 的文档。

这里有一些例子:

  • 以下 appender 定义将导致 Calzada.log 每次 Calzada.log 达到 10KB 时滚动到 ATrackAT1Handler.%i.log 并且Logback 将保留最多 10 个历史文件,即 ATrackAT1Handler.1.logATrackAT1Handler.10.log

    <appender name="FILE-AUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>Calzada.log</file>
        <encoder>
            <pattern>%d{"yyyy-MM-dd HH:mm"} [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <fileNamePattern>ATrackAT1Handler.%i.log</fileNamePattern>
            <minIndex>1</minIndex>
            <maxIndex>10</maxIndex>
        </rollingPolicy>
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>10KB</maxFileSize>
        </triggeringPolicy>
    </appender>
    
  • 以下 appender 定义将导致 Calzada.log 每次 Calzada.log 达到 10KB 时滚动到 ATrackAT1Handler.<yyy-MM-dd>.%i.log 并且Logback 将最多保留 10 天 的历史日志文件,但是(这是一个重要的区别)Logback 将在每个文件中滚动 的文件数量没有上限天。所以,你可以从 ATrackAT1Handler.2017-09-06.0.logATrackAT1Handler.2017-09-06.20.log 然后第二天你可以从 ATrackAT1Handler.2017-09-07.0.logATrackAT1Handler.2017-09-07.12.log 等等

    <appender name="FILE-AUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>Calzada.log</file>
        <encoder>
            <pattern>%d{"yyyy-MM-dd HH:mm"} [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>ATrackAT1Handler.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>10KB</maxFileSize>
            <maxHistory>10</maxHistory>
        </rollingPolicy>
    </appender> 
    

因此,FixedWindowRollingPolicy 允许您控制历史文件的数量和大小,而 TimeBasedRollingPolicy 允许您控制历史文件的天数和每个文件的大小。 TimeBasedRollingPolicy 似乎缺少了一块,即我们如何限制所有天的所有文件的总大小?为了填补这个空白,TimeBasedRollingPolicy 提供了配置 属性:totalSizeCap。来自文档:

totalSizeCap int

The optional totalSizeCap property controls the total size of all archive files. Oldest archives are deleted asynchronously when the total size cap is exceeded. The totalSizeCap property requires maxHistory property to be set as well. Moreover, the "max history" restriction is always applied first and the "total size cap" restriction applied second.

因此,您可以选择 FixedWindowRollingPolicy 来限制文件数量,但不会有每日转存,或者使用 TimeBasedRollingPolicy 获得每日转存并保留 some 通过 ising totalSizeCap.

控制历史日志文件占用空间