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 常用配置


<contextName>logbackcontextName>

<property name="log.path" value="../logs/worknotice"/>


<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    
    <file>${log.path}/log_info.logfile>
    
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
        <charset>UTF-8charset>
    encoder>
    
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        
        <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.logfileNamePattern>
        
        <maxFileSize>100MBmaxFileSize>
        
        <maxHistory>15maxHistory>
        
        <totalSizeCap>20GBtotalSizeCap>
        
        <cleanHistoryOnStart>truecleanHistoryOnStart>
    rollingPolicy>
    
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>infolevel>
        <onMatch>ACCEPTonMatch>
        <onMismatch>DENYonMismatch>
    filter>
appender>

2.2 原因分析与解决方案

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

  • 1、fileNamePattern 配置的是月、年等,而你想要的是天, 这里检查一下配置方式是否与预期相符——属细节问题
  • 2、配置 cleanHistoryOnStart 属为 true 即可——这是网上解释最多遇到最多的一点。
  • 3、结构类-我遇到的问题:前面介绍了,lgoback 要有 appender、root、logger 三个级别,这里要对应上
    • appender name=“INFO_FILE” 要在 root 里进行引用
    • 要与 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

你可能感兴趣的:(logback,SpringBoot)