一、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包含两个属性
name
、class
2、Appender按类型分为ConsoleAppender
(控制台输出日志)、FileAppender
(日志文件)
属性名 | 说明 |
---|---|
name | appender的名称,<logger>和<root>中通过<appender-ref ref =“CONSOLE”/>关联此name属性 |
class | appender的类 |
- 使用示例
<!--
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.log | appender输出的日志目录,不存在则自动创建 |
append | true | false | 是否以追加的方式写到日志文件,默认true |
encoder | 编码器 | 指定日志格式 和字符集 |
prudent | true | false ,是否开启安全模式 | 默认false ,依赖文件独占锁实现,一般不建议修改,性能较差 |
4.2、RollingFileAppender使用
继承自FileAppender
,支持日志分片
和历史日志的自动删除
,其属性如下
属性名称 | 说明 | 备注 |
---|---|---|
file | String | 日志文件的路径,如 /temp/test.log |
append | true | false | 是否以追加的方式写到日志文件,默认true |
encoder | 编码器 | 指定日志格式 和字符集 |
prudent | true | 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
属性名称 | 值说明 | 说明 | 备注 |
---|---|---|---|
fileNamePattern | String | 分片/归档日志文件名正则,如 /log/myapplication.%d{yyyy-MM-dd} .log | 策略就是按日期分片,所以应该包含日期配置%d ,其说明如下:1、底层日期格式化通过 SimpleDateFormat 实现2、默认格式化为 yyyy-MM-dd 3、自定义日期格式化和时区, %d{yyyy-MM-dd} 、%d{yyyy-MM-dd, UTC} |
maxHistory | int | 保留归档日志周期,小时/天/周等 ,以fileNamePattern中%d 配置的最小时间粒度 为单位 | 如: maxHistory=3 1、若 /log/myapplication. %d{yyyy-MM-dd} .log,时间粒度为天 ,则 代表保留3天 ;2、 %d{yyyy-MM} .log 时间粒度为月 ,则保留3个月 |
totalSizeCap | String,纯数字默认单位为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 (它最老) |
cleanHistoryOnStart | true | 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
属性名称 | 值说明 | 说明 | 备注 |
---|---|---|---|
fileNamePattern | String | 分片/归档日志文件名正则,如 /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} |
maxHistory | int | 保留归档日志周期,小时/天/周等 ,以fileNamePattern中%d 配置的最小时间粒度为单位 | 如: maxHistory=3 1、若 /log/myapplication. %d{yyyy-MM-dd} .log,时间粒度为天 ,则 代表保留3天 ;2、 %d{yyyy-MM} .log 时间粒度为月 ,则保留3个月 |
totalSizeCap | String 默认单位为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 (它最老) |
cleanHistoryOnStart | true | false | 项目启动时是否清理归档日志 | 异步清理 |
maxFileSize | 同totalSizeCap | file最大容量,超过即分片 | 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
过滤器,过滤满足条件或者不满足条件的日志
允许组合使用,可配置多个
过滤器有很多,只介绍两种常用的LevelFilter
、ThresholdFilter
名称 | 值说明 | 说明 | 备注 |
---|---|---|---|
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 |
onMatch | DENY, NEUTRAL, ACCEPT | DENY :拒绝,不再执行后续的过滤器NEUTRAL :中性,继续执行后面的过滤器 ACCEPT :接受,记录日志,不再执行后续过滤器 |
onMismatch | DENY, 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