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
### 回答1: maxHistory的值可以根据您想要记录的数量来设置。具体代码如下: <logger name="com.foo" additivity="false" > <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> <appender-ref ref="EMAIL" /> <maxHistory>5</maxHistory> </logger> ### 回答2: 在logback-spring.xml配置文件中,maxHistory属性可以表示日志文件保留天数保留数量。如果你想要配置maxHistory属性来表示保留日志文件数量,可以按照以下步骤进行设置。 首先,确保你已经在pom.xml中引入了logback-classic依赖,这是logback框架的一个主要组件。以下是一个示例的pom.xml文件片段: ```xml <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.4</version> </dependency> ``` 接下来,在logback-spring.xml配置文件中,找到FileAppender节点,并将maxHistory属性值设置为你所需的日志文件保留数量。以下是一个示例的logback-spring.xml配置: ```xml <configuration> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/path/to/log/file.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>/path/to/log/file.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxHistory>10</maxHistory> <!-- 这里设置为10表示保留最近的10个日志文件 --> </rollingPolicy> <encoder> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="FILE" /> </root> </configuration> ``` 在上面的示例中,我们使用了RollingFileAppender来记录日志,并定义了一个TimeBasedRollingPolicy来控制日志文件的滚动。maxHistory属性值被设置为10,表示最多会保留10个日志文件。 以上是一个简单logback-spring.xml配置文件示例,你可以根据自己的需求进行适当的修改和扩展。 ### 回答3: 在logback-spring.xml配置文件中,maxHistory属性用于设置保留日志文件的最大历史记录。默认情况下,maxHistory的值是3,表示保留最近的3个日志文件。 如果你希望将maxHistory配置为数量而不是天数,可以将配置修改如下: ```xml <configuration> <!-- 其他配置参数 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 其他appender配置参数 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 其他rollingPolicy配置参数 --> <fileNamePattern>/path/to/logfile-%i.log</fileNamePattern> <!-- 将maxHistory设置为保留日志文件数量 --> <maxHistory>10</maxHistory> </rollingPolicy> </appender> <!-- 其他logger配置 --> <root level="info"> <appender-ref ref="FILE" /> </root> </configuration> ``` 在上述配置中,通过在rollingPolicy元素下添加maxHistory元素,并将其值设置为10,表示保留最近的10个日志文件。 需要注意的是,为了使maxHistory配置生效,必须使用TimeBasedRollingPolicy作为rollingPolicy的实现类,并且保证fileNamePattern元素配置中包含"%i",它将在每次滚动时自动增加一个索引。 通过以上的配置,maxHistory将被解析为日志文件的数量,不再表示天数。请将"/path/to/logfile"替换为实际的日志文件路径。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AGI舰长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值