目录
TimeBasedRollingPolicy基于时间滚动策略
SizeAndTimeBasedRollingPolicy基于时间和文件大小的滚动策略
前言
Logback是由log4j创始人设计的另一个开源日志组件,比log4j功能更强大,效率更高。
Logback的性能是log4j的2倍
官方网站:http://logback.qos.ch/documentation.html。
本文较为详细地讲述logback的日志输出使用原理、如何配置,并结合具体的代码,给出程序调用的方法。为了讲清原理,本文从log4j的日志级别开讲,然后讲述主配置文件log4j2.xml的配置方法、程序调用方法,并给出一个比较完整的log4j2配置文件。
一、Logback的级别解读
Logback共定义了8个级别的log(除去OFF和ALL,可以说分为6个级别),优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。目前log4j官方推荐的共四个级别:ERROR、WARN、INFO、DEBUG。
OFF-第8级,最高等级,虚拟级别,用于关闭所有日志记录。
FATAL-第7级,不可用的致命级别,已被slf4j弃用,官方解释是和ERROR没有绝对的界限。
ERROR-第6级,可用的错误级别,很常用,推荐级别,用于捕获错误事件。
WARN-第5级,可用的告警级别,用得相对较少但位置很关键,表示潜在的可能错误。
INFO-第4级,可用的信息级别,最常用,推荐级别,用于打出程序的关键信息、阶段性的历程碑信息。
DEBUG-第3级,可用的调试级别,详尽的、可用于程序调试的级别,看日志类似看代码的执行过程。
TRACE-第2级,可用的追踪级别,但一般不建议使用,用于极为详尽的step-by-step日志追踪。
ALL-第1级,最低等级,虚拟级别,用于打开所有日志记录。
二、Logback的配置文件
1 配置文件原理
(1) 配置文件查找顺序
Logback查找配置文件的先后顺序是:
1.logback-test.xml;
2.logback.groovy;
3.logback.xml;
如果上述三个配置文件都没有找到,则使用默认配置打印到控制台。
Logback优先读取测试环境配置,后读取生产环境配置。此外,相比于XML,Groovy风格的配置文件更加直观,当前已有工具支持自动把logback.xml文件迁移至logback.groovy,但当前使用较少,因此本文的讲述,都基于logback.xml。
Logback配置文件中所有的element、属性值、属性名、类名、文件、目录名、PatternLayout的字符串等均区分大小写。
(2) 配置文件基本结构
Logback.xml的基本结构如下所示:
根element为configuration,一个configuration至少要包含一个root和一个appender,logger为可选项,如有需要appender和logger可配置多个。
......
<configuration debug="false" scan="true" scanPeriod="1 seconds">
......
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter ......>
<rollingPolicy
<encoder ......>
......
</appender>
......
<logger name=......>
.....
</loggers>
......
<root ......>
......
</root>
</configuration>
(3)关于对appender和logger的理解
logger用来收集日志,appender用来输出日志,此外root是一种特殊的logger,所以整体来说,configuration里面配置的其实就是两类内容:appender和logger。
关于对其关系的理解,笔者看到了一个非常好的比喻,即logger是会写字的人,appender是文字的输出或者展现方式,可以理解为黑板、本子等等。logger和appender共同完成的就是:一个人在收集到日志后,根据需要可以将字写在黑板上,也可以将字写在本子上,供给需要的人看。
(4) logback.xml的配置优势
logback.xml配置起来方便灵活,比如某级别日志独立输出、异步日志等,通过调用不同的class即可实现。
2 起始和Configuration总段落
(1) xml起始
起始段落为固定的写法,注意encoding写为UTF-8,!DOCTYPE用以声明文件类型,后续文件类型不区分大小写。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
(2) Configuration根节点属性
Configuration共有三个属性:
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
scan:配置是否对配置文件修改进行检测,默认值为true,即:配置文件如果发生改变,将会被重新加载。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
<configuration debug="false" scan="true" scanPeriod="30 seconds">
(3) Properties段落
这个段落主要用于配置Logback的属性,更有用的是配置一些变量,用在后面的appenders段落和loggers段落用${VARIABLE}引用。
这里配置日志存放目录、历史日志存放目录、日志文件切换大小这3个变量。
<Property name="logDir" value="./logs" />
<Property name="histLogDir" value="./logs/hist"/>
<Property name="splitSize" value="1MB" />
3 appenders段落
本段落可包括多个appender,每个appender均代表一种日志输出格式。
每个appender都有两个属性name和class,name用来给当前appender命名,以便logger使用。class用来指定输出策略,常用就是控制台输出策略和文件输出策略,而文件输出策略包括基础的FileAppender,以及基于时间等维度的RollingFileAppender。
如:控制台输出
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
如:滚动日志输出
<appender name="ErrorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
此外,appender主要包括以下子节点:
- filter 过滤器,可以自定义拦截器也可以用系统一些定义好的拦截器
- file &append fileappender策略开启时,用来指明日志文件的输出位置,可以是绝对路径也可以是相对路径
- encoder 指定具体输出的日志格式
- rollingPolicy 日志滚动策略
- triggerPolicy 触发
我们将逐一介绍上述各子节点。
(1)filter
任一输出策略类型的appender均可使用filter,主要分两种,一是级别过滤器,根据日志级别进行输出,一是阈值过滤器,与log4j类似,用以过滤掉低于指定级别的日志。相较log4j,Logback对不同级别日志的过滤方式更为丰富灵活。下面我们来看两种过滤器的范例。
- 级别过滤器
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
执行结果:
2022-12-17 15:50:57.635 [main] INFO com.yangchr.sb002.entity.logBackTest 日志输出,INFO 日志---256,托尼
在级别过滤器中,共有三个子element,level用以设置过滤级别,onMatch和onMismatch用以配置满足和不满足过滤条件时的操作,包括ACCEPT、DENY、NEUTRAL。在上面的例子中,onMatch="ACCEPT" onMismatch="DENY"表示,高于等于DEBUG级别的日志给与输出,非INFO级别的日志不予输出。
从这个例子可以看出,Logback在实现单一级别日志输出的时候,相较log4j来说,是非常方便的,仅通过调用级别过滤器即实现了姊妹篇《log4j2日志输出配置和使用-要点攻略》中的专题三内容。
- 阈值过滤器
阈值处理器中仅一个子element,即level。当日志级别等于或高于临界值level时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志返回DENY。
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
输出结果为:
2022-12-17 16:28:58.185 [main] ERROR com.yangchr.sb002.entity.logBackTest 日志输出,ERROR日志---256,托尼
2022-12-17 16:28:58.185 [main] WARN com.yangchr.sb002.entity.logBackTest 日志输出,WARN 日志---256,托尼
2022-12-17 16:28:58.185 [main] INFO com.yangchr.sb002.entity.logBackTest 日志输出,INFO 日志---256,托尼
从上面的例子看出,Logback通过阈值过滤器实现了log4j2中的ThresholdFilter 功能。
(2)file & append
当日志输出策略为fileappend时,用到file & append两个子element。其中file用以指定待写入的文件名,可带绝对或相对路径。append为true时,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
<appender name="FILE" class="ch.qos.logback.