logback简单使用及 MaxHistory 属性日志文件保留天数不生效问题

前面我写了一篇 Linux cron 定时任务方式实现日志文件的自动备份与清除,其实对于 SpringBoot 通过 logback 可以直接集成。 今天在做这种方式实现这个功能时遇到一个棘手问题就是 MaxHistory 属性日志文件保留天数不生效,这里做一下记录,顺便简单介绍一下 logback.xml。

1、 logback 基本使用-结构

logback 的三部分结构:appender、root、logger

  • appender
    encoder:确定将事件写入基础的方式OutputStreamAppender
    filter:过滤此日志文件只记录xx级别的日志
    rollingPolicy:日志记录器的滚动策略【此文重点问题坑】
  • root
    打印控制台,跟着 ref
    <root level="info">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="INFO_FILE"/>
        <appender-ref ref="ERROR_FILE"/>
    </root>
  • logger
    某模块路径的打印级别配置
<logger name="com.javastarboy.worknotice" level="info" />

2、MaxHistory 属性日志文件保留天数不生效问题

MaxHistory 属性可以按“文件数量、小时、天、月、年”等策略实现文件保留。但是很多人都遇到过此配置不生效问题,网上都只介绍了 cleanHistoryOnStart ,而我是另一种情况,这里汇总一下。

2.1 先介绍一下 appender 常用配置

<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<contextName>logback</contextName>
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
<property name="log.path" value="../logs/worknotice"/>

<!-- 时间滚动输出 level为 INFO 日志 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- 正在记录的日志文件的路径及文件名 -->
    <file>${log.path}/log_info.log</file>
    <!--日志文件输出格式-->
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        <charset>UTF-8</charset>
    </encoder>
    <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- 每天日志归档路径以及格式,编码器 -->
        <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
        <!--每个文件最多100MB-->
        <maxFileSize>100MB</maxFileSize>
        <!--日志文件保留天数-->
        <maxHistory>15</maxHistory>
        <!--每个文件最多100MB,保留15天的历史记录,但最多20GB-->
        <totalSizeCap>20GB</totalSizeCap>
        <!--重启清理日志文件-->
        <cleanHistoryOnStart>true</cleanHistoryOnStart>
    </rollingPolicy>
    <!-- 此日志文件只记录info级别的 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>info</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>

2.2 原因分析与解决方案

大家项目中大多数配置方式都与上面类似,这里面最常见的问题就是日志保留天数配置 maxHistory 无效,不能自动删除过期日志文件。原因可能如下:

  • 1、fileNamePattern 配置的是月、年等,而你想要的是天, 这里检查一下配置方式是否与预期相符——属细节问题
  • 2、配置 cleanHistoryOnStart 属为 true 即可——这是网上解释最多遇到最多的一点。
  • 3、结构类-我遇到的问题:前面介绍了,lgoback 要有 appender、root、logger 三个级别,这里要对应上
    • appender name=“INFO_FILE” 要在 root 里进行引用
      <appender-ref ref="INFO_FILE"/>
    • <root level="info">要与 logger 下的 level=“info” 对应。——这是我遇到的问题
  • 优化类:建议追加最大配置,按照实际业务情况配置 totalSizeCap ,避免占用磁盘空间。(作用是,假如你诉求是 maxHistory 保留7天日志文件,但是可能这7个文件总大小超出磁盘容量,所以可以通过 totalSizeCap 来控制总大小,这样系统会判断大于此值时进行自动覆盖。)

3、 重点配置详解

详解见官网: http://logback.qos.ch/manual/appenders.html

3.1 maxHistory

可选的 maxHistory 属性控制要保留的归档文件的最大数量,以异步方式删除较旧的文件。例如,如果您指定每月滚动,并将maxHistory设置为6,则将保留6个月的归档文件,并删除6个月以上的文件。请注意,由于删除了旧的归档日志文件,因此将适当删除为日志文件归档而创建的所有文件夹。

3.2 totalSizeCap

可选的totalSizeCap 属性控制所有存档文件的总大小。当超过总大小上限时,最早的档案将被异步删除。该totalSizeCap属性要求maxHistory属性设置为好。此外,始终会首先应用“最大历史记录”限制,然后再应用“总大小上限”限制。

3.3 cleanHistoryOnStart

如果设置为true,则将在追加程序启动时执行归档删除。默认情况下,此属性设置为false。
通常在过渡期间执行归档删除。但是,某些应用程序的生存时间可能不足以触发翻转。因此,对于这种短暂的应用程序,归档删除可能永远不会有执行的机会。通过将cleanHistoryOnStart设置为true,将在附加程序启动时执行归档删除。

3.4 fileNamePattern 值及其作用说明

fileNamePattern 展期时间表
/wombat/foo.%d 每日滚动(在午夜)。由于省略了%d令牌说明符的可选时间和日期模式,因此采用了默认模式yyyy-MM-dd,它对应于每日滚动。 未设置文件属性:在2006年11月23日,日志记录输出将进入文件 /wombat/foo.2006-11-23。在午夜以及24日的其余时间,日志记录输出将定向到 /wombat/foo.2006-11-24。文件属性设置为 /wombat/foo.txt:在2006年11月23日,日志输出将转到文件/wombat/foo.txt。在午夜,foo.txt将重命名为 /wombat/foo.2006-11-23。将创建一个新的 /wombat/foo.txt文件,并在11月24日的其余时间将日志输出定向到 foo.txt。
/wombat/%d{yyyy/MM}/foo.txt 在每个月初进行过渡。 未设置文件属性:在2006年10月,日志记录输出将进入 /wombat/2006/10/foo.txt。在10月31日午夜之后和11月下旬,日志记录输出将定向到/wombat/2006/11/foo.txt。文件属性设置为 /wombat/foo.txt:活动日志文件将始终为 /wombat/foo.txt。在2006年10月,日志记录输出将转到/wombat/foo.txt。在10月31日午夜,/ wombat/foo.txt将重命名为/wombat/2006/10/foo.txt。将创建一个新的 /wombat/foo.txt文件,该日志文件将在11月下旬输出。在11月30日午夜,/ wombat / foo.txt将重命名为 /wombat/2006/11/foo.txt,依此类推。
/wombat/foo.%d{yyyy-ww}.log 在每周的第一天进行过渡。请注意,一周的第一天取决于语言环境。 与以前的情况类似,不同的是,过渡将在每个新的星期开始时进行。
/wombat/foo%d{yyyy-MM-dd_HH}.log 每小时顶部滚动一次。 与以前的情况类似,除了过渡将在每小时的顶部进行。
/wombat/foo%d{yyyy-MM-dd_HH-mm}.log 每分钟开始时进行翻转。 与以前的情况类似,除了在每分钟的开始发生翻转。
/ wombat / foo%d {yyyy-MM-dd_HH-mm,UTC} .log 每分钟开始时进行翻转。 与以前的情况类似,除了文件名将以UTC表示。
/ foo /%d {yyyy-MM,aux } /%d.log 每天滚动。存档位于包含年和月的文件夹下。 在此示例中,第一个%d令牌被标记为 辅助 iliary。然后假定第二个%d令牌是主要令牌,其中省略了时间和日期模式。因此,过渡将每天发生一次(%d的默认设置),并且文件夹名称将取决于年份和月份。例如,在2006年11月,归档文件将全部放在/ foo / 2006

猜你喜欢

转载自blog.csdn.net/u012723183/article/details/107685109