【Logback】<appender>标签详解

一、Appender是什么

1.1、Appender定义

1、Appender是Logback中执行将日志事件输出的组件。
2、<appender>可以直接配置在<configuration>中,或者配置独立xml文件<included>节点中,<configuration>通过<include>来引用
3、必须在<root>或者<logger>中通过<appender-ref>引用相应的<appender>才生效。<logger><root>会将相关的日志时间委托给<appender>执行日志的输出(控制台或者文件)

1.2、Appender类图说明

Appender的类图如下:(此图摘自Logback官网
请添加图片描述
通过上述类图可以看出

1、Appender中包含Filter
2、Appender中包含Encoder
3、Appender分为ConsoleAppender(控制台)、FileAppender(日志文件)两种

Appender分类说明备注
ConsoleAppender控制台日志追加器
FileAppender文件日志追加器默认追加方式 写到指定日志文件
└─RollingFileAppender滚动日志追加器可按规则自动分片归档日志,自动压缩自动删除过期日志

二、Appender概述

  • 定义

1、Appender包含两个属性nameclass
2、Appender按类型分为 ConsoleAppender(控制台输出日志)、FileAppender(日志文件)

属性名说明
nameappender的名称,<logger>和<root>中通过<appender-ref ref=“CONSOLE”/>关联此name属性
classappender的类
  • 使用示例
<!-- 
  springProperty: 读取spring环境ConfigurableEnvironment配置,即application.yml或者application.peroperties中的配置 
-->
<springProperty name="CONSOLE_LOG_PATTERN" source="logging.pattern.console"
          defaultValue="%clr(%d{HH:mm:ss.SSS}){faint} %clr(%5p) %clr(---){faint} %clr([%25.25t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n"/>

<!-- 控制台日志 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
</appender>
<!-- 日志文件 -->
<appender name="FILE_ALL" class="ch.qos.logback.core.rolling.FileAppender">
</appender>
<!-- 滚动日志文件-->
<appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
</appender>

三、ConsoleAppender使用

控制台输出,底层通过System.out 来实现的

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
        <charset>UTF-8</charset>
    </encoder>
</appender>

四、FileAppender使用

顾名思义,就是将日志事件追加到指定日志文件中

4.1、FileAppender使用

ch.qos.logback.core.FileAppender并不常用,一般都是使用ch.qos.logback.core.rolling.RollingFileAppender(支持分片和自动删除)
属性配置如下

属性名称说明备注
file日志文件的路径,如 /temp/test.logappender输出的日志目录,不存在则自动创建
appendtrue | false是否以追加的方式写到日志文件,默认true
encoder编码器指定日志格式字符集
prudenttrue | false ,是否开启安全模式默认false ,依赖文件独占锁实现,一般不建议修改,性能较差

4.2、RollingFileAppender使用

继承自FileAppender,支持日志分片和历史日志的自动删除,其属性如下

属性名称说明备注
fileString日志文件的路径,如 /temp/test.log
appendtrue | false是否以追加的方式写到日志文件,默认true
encoder编码器指定日志格式字符集
prudenttrue | false安全模式,默认false ,依赖文件独占锁实现,性能较差,不要开启 。开启时:
1、不支持FixedWindowRollingPolicy策略
2、不支持日志文件压缩,rollingPolicy中提供自动压缩功能
3、prudent开启时,file参数必须为空
rollingPolicy滚动(归档)策略1、TimeBasedRollingPolicy:按时间滚动(归档),超出指定时间范围内的日志自动删除
2、SizeAndTimeBasedRollingPolicy :按时间和文件大小滚动 (归档),超出指定时间自动删除,且指定时间内的所有分片日志总大小超过指定大小的,自动删除最老的归档日志分片
triggeringPolicy滚动(归档)触发策略一般不需要配置

RollingFileAppender执行流程如下:

1、日志始终往file配置的日志文件中追加写入,如file不存在则自动创建,如 /temp/test.log
2、按rollingPolicy配置的策略,当满足策略时,自动将file重命名为rollingPolicy中指定的归档日志文件名,生成历史归档日志,如 /temp/test.2023-04-12.log,并对归档日志进行压缩过期日志删除
3、循环 1-2

4.2.1、RollingPolicy

4.2.1.1、TimeBasedRollingPolicy
属性名称值说明说明备注
fileNamePatternString分片/归档日志文件名正则,如 /log/myapplication.%d{yyyy-MM-dd}.log策略就是按日期分片,所以应该包含日期配置%d,其说明如下:
1、底层日期格式化通过SimpleDateFormat实现
2、默认格式化为yyyy-MM-dd
3、自定义日期格式化和时区,%d{yyyy-MM-dd}%d{yyyy-MM-dd, UTC}
maxHistoryint保留归档日志周期,小时/天/周等 ,以fileNamePattern中%d配置的最小时间粒度为单位如: maxHistory=3
1、若 /log/myapplication.%d{yyyy-MM-dd}.log,时间粒度为,则 代表保留3天
2、%d{yyyy-MM}.log 时间粒度为,则保留3个月
totalSizeCapString,纯数字默认单位为byte
可指定单位kb、kbs、mb、mbs、gb、gbs,不区分大小写 如:
5000000、
5000KB、
5MB、
2GB
maxHistory时间内允许的全部归档日志最大容量。对于maxHistory范围内的归档日志,总计超出totalSizeCap大小,则异步清理删除最老的归档日志分片如:maxHistory=3,fileNamePattern=/log/myapplication.%d{yyyy-MM-dd}.log
归档日志有三个,都有maxHistory指定日期内
1、/log/myapplication.2022-04-01.log
2、/log/myapplication.2022-04-02.log
3、/log/myapplication.2022-04-03.log
若三个日志总大小相加超过totalSizeCap配置范围,则异步删除/log/myapplication.2022-04-01.log(它最老)
cleanHistoryOnStarttrue | false项目启动时是否清理归档日志异步清理

日志文件按fileNamePattern指定的日志文件名和%d指定的日期进行归档,文件名即为fileNamePattern指定文件
若日志为超出maxHistory指定时间范围外的,则异步删除归档日志
若在maxHistory指定时间范围内,则判断总的日志大小是否超过totalSizeCap,超过则异步删除最老日志文件

4.2.1.2、SizeAndTimeBasedRollingPolicy

TimeBasedRollingPolicy的子类,扩展点如下:
1、区别仅仅是多一个参数maxFileSize配置指明单个日志文件最大值
2、fileNamePattern中支持语法%i配置分片规则,从0开始自增
3、跨天的先 按天分片,同一天内file容量超过maxFileSize ,再按maxFileSize容量分片
==> 如: /log/myapplication.%d{yyyy-MM-dd}.%i.log => /log/myapplication.2022-04-01.0.log

属性名称值说明说明备注
fileNamePatternString分片/归档日志文件名正则,如 /log/myapplication.%d{yyyy-MM-dd}.%i.log策略就是按日期分片,所以应该包含日期配置%d,其语法如下:
1、底层日期格式化通过SimpleDateFormat实现
2、默认yyyy-MM-dd
3、自定义日期格式化和时区,%d{yyyy-MM-dd}%d{yyyy-MM-dd, UTC}
maxHistoryint保留归档日志周期,小时/天/周等 ,以fileNamePattern中%d配置的最小时间粒度为单位如: maxHistory=3
1、若 /log/myapplication.%d{yyyy-MM-dd}.log,时间粒度为,则 代表保留3天
2、%d{yyyy-MM}.log 时间粒度为,则保留3个月
totalSizeCapString
默认单位为byte,可指定单位kb、kbs、mb、mbs、gb、gbs
不区分大小写;
如: 5000000、
5000KB、
5MB、
2GB
maxHistory时间内允许的全部归档日志最大容量。对于maxHistory范围内的归档日志,总计超出totalSizeCap大小,则异步清理删除最老的归档日志分片如:maxHistory=3,fileNamePattern=/log/myapplication.%d{yyyy-MM-dd}.%i.log
归档日志有三个,都有maxHistory指定日期内
1、/log/myapplication.2022-04-01.0.log
2、/log/myapplication.2022-04-01.1.log
3、/log/myapplication.2022-04-0.1.2log
若三个日志总大小相加超过totalSizeCap配置范围,则异步删除/log/myapplication.2022-04-01.0.log(它最老)
cleanHistoryOnStarttrue | false项目启动时是否清理归档日志异步清理
maxFileSizetotalSizeCapfile最大容量,超过即分片SizeAndTimeBasedRollingPolicy新增配置

4.2.2、TriggeringPolicy

不需要额外配置
控制发生滚动(分片)的条件。这些条件包括一天中的时间、文件大小、外部事件、日志请求或它们的组合。
TimeBasedRollingPolicy实现了该接口TriggeringPolicy,即TimeBasedRollingPolicy既是 RollingPolicy 也是 TriggeringPolicy

源码如下

// 常用的策略就2个:SizeAndTimeBasedRollingPolicy、TimeBasedRollingPolicy
// 其类关系如下,都实现了TriggeringPolicy
public class SizeAndTimeBasedRollingPolicy<E> extends TimeBasedRollingPolicy<E> {}
public class TimeBasedRollingPolicy<E> extends RollingPolicyBase implements TriggeringPolicy<E> {}

4.2.3、Filter

过滤器,过滤满足条件或者不满足条件的日志
允许组合使用,可配置多个
过滤器有很多,只介绍两种常用的LevelFilterThresholdFilter

名称值说明说明备注
LevelFilter级别过滤器精确匹配指定的日志级别
ThresholdFilter阈值过滤匹配等于或高于指定级别

使用示例如下

    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>INFO</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
    
    <!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
    <!-- 拒绝所有级别低于 INFO 的, 也就是 TRACE 和 DEBUG -->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>INFO</level>
    </filter>

LevelFilter属性如下:

属性值类型说明
level匹配级别OFF、ERROR、WARN、INFO、DEBUG、TRACE、ALL
onMatchDENY, NEUTRAL, ACCEPTDENY:拒绝,不再执行后续的过滤器
NEUTRAL:中性,继续执行后面的过滤器
ACCEPT:接受,记录日志,不再执行后续过滤器
onMismatchDENY, NEUTRAL, ACCEPT同上

4.2.4、Encoder

指定输出日志格式化和字符集

属性值类型说明
pattern日志格式
charset字符集默认null,对应于系统的默认字符集

三、RollingFileAppender完整示例

<!-- 
  springProperty: 读取spring环境ConfigurableEnvironment配置,即application.yml或者application.peroperties中的配置 
-->
<springProperty name="LOG_FILE_PATH" source="logging.file.path" defaultValue="logs/case-logback"/>
<springProperty name="FILE_LOG_PATTERN" source="logging.pattern.file"
          defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p --- [%30.30t] %-40.40logger{39} : %m%n"/>
          
<!-- 所有日志 -->
<appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 日志文件名称 -->
        <file>${LOG_FILE_PATH}/${APPLICATION_NAME:-case-logback}.all.log</file>
        <append>true</append>
        <!--
            容量和时间滚动策略 SizeAndTimeBasedRollingPolicy
            https://logback.qos.ch/manual/appenders.html#SizeAndTimeBasedRollingPolicy
        -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--
                日志文件文件名分片正则
                1、%d:日期,默认 yyyy-MM-dd,可以通过 %d{yyyy-MM-dd, UTC} 来自定义日期格式化,可以指定时区timezone,底层通过java.text.SimpleDateFormat处理
                2、%i:自增序号,从0开始
                3、.gz:文件后缀判断是否开启压缩,支持.gz 和 .zip
             -->
            <fileNamePattern>
                ${LOG_FILE_PATH}/history/${APPLICATION_NAME:-case-logback}.all.%d{yyyy-MM-dd-HH-mm}.%i.log.gz
            </fileNamePattern>
            <!--
                单个日志文件的最大容量,默认单位 Bytes,可指定 KB、MB、GB
            -->
            <maxFileSize>1MB</maxFileSize>
            <!--
                历史日志最大保留时长,以 %d{yyyy-MM-dd-HH-mm} 配置的时间粒度处理,例如:本配置精确到分,则为最大保留3分钟的日志文件,超出3分钟的日志分片异步删除
                0:禁用,即 不保留历史日志
             -->
            <MaxHistory>3</MaxHistory>
            <!-- 日志文件总计最大容量
                MaxHistory 时间内,但是总容量超过该值,自动删除最老的日志文件
                例如: 本配置,保留3分钟(MaxHistory)的历史日志,但是3分钟内所有日志文件总容量超过 2MB (totalSizeCap)的,从最老的开始删除
             -->
            <totalSizeCap>2MB</totalSizeCap>
            <!-- 启动时清理日志 -->
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <Pattern>${FILE_LOG_PATTERN}</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

四、参考资料

https://logback.qos.ch/manual/filters.html
https://logback.qos.ch/manual/appenders.html

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值