深入探索Logback日志框架的原理分析和开发实战指南系列
- Logback日志框架
- Logback基本模块
-
- logback-core
- logback-classic
- logback-access
- Logback的核心类
- Logbackj日志级别
- Logback的maven依赖
- Logback的Logger详细介绍
- Logback的Filter详细介绍
-
- [Regular Filter](#Regular Filter)
- [Turbo Filter](#Turbo Filter)
- 常见的过滤器
- 本文总结
Logback日志框架
"Logback"是一个开源的日志组件,它的设计者也是"Log4j"的作者。相比于"Log4j",它拥有更好的特性,因此成为了一个取代"Log4j"的优秀的日志框架。如果您正寻找一款优秀的日志组件,那么"Logback"将是一个不错的选择。
Logback基本模块
logback-core
logback-core是logback日志系统的核心组件,提供了基础结构,如Loggers、Appenders、Layouts、Filters等等,用于创建、配置和管理logback事件。它是logback的最底层组件,为其他组件提供支持,但使用者通常不需要直接使用它,而是通过更高级别的logback组件使用它的功能。
logback-classic
logback-classic是logback日志系统的核心实现,基于logback-core,提供了更高级别和更易用的API及强大的日志框架功能,如异步日志、日志分级、Logger上下文等等。它还支持SLF4J,提供符合JDK标准的Java日志框架API接口,同时也具备logback自身的特性。因此,logback-classic是使用logback的主要方式,也是logback日志系统的经典实现。
logback-access
logback-access是logback日志系统的其中一个模块,专为记录web应用程序的访问日志而设计。它类似于访问日志分析工具,可帮助开发人员深入了解客户端请求、服务器响应和应用程序运行状态,以便进行调整和优化。logback-access能够自动捕捉HTTP请求和响应对象,提供多种配置选项,定制记录内容和格式化方式。此外,它与logback-classic能够很好地配合使用,将应用程序访问日志和其他日志信息记录到同一文件中,方便管理和分析。
Logback的核心类
Logger
在Logback-classic模块中,日志记录器负责记录日志,并将其关联到应用程序的上下文中,以便存储日志对象。此外,日志记录器还可用于定义日志的级别和类型。
Appender
在Logback-core模块中,主要作用是指定日志输出的目标地点,包括但不限于控制台、文件、远程套接字服务器、MySQL、PostreSQL、Oracle数据库、以及其他数据库、JMS和远程UNIX Syslog守护进程。
Layout
在Logback-core模块中,日志布局(Log Layout)子模块负责将事件转换成字符串并格式化日志信息的输出。如果需要进一步了解布局的详细信息,可以参考Log4j的布局(Layout)模块,以获得更深入的理解。
Layout和Appender
Appender和Layout实现与Logger分离,它们不依赖Logger,也不受Logger的影响。但是,如此才能够保证日志信息能够正常打印出来,Logger需要依赖于Appender和Layout的协作。
filter
Filter主要应用于Appender,用于过滤与日志相关的信息,并仅在Appender级别生效,主要用于控制的日志的可见性功能问题和管理。
logback模块和核心所属关系
Logbackj日志级别
Logback 日志框架共有5种级别,分别为 TRACE 、 DEBUG 、 INFO 、 WARN 、 ERROR,这些级别均被定义在ch.qos.logback.classic.Level类中。
日志输出级别
日志级别可以分为五个等级,从低到高依次为:TRACE < DEBUG < INFO < WARN < ERROR。
从上面可以看出,等级高的级别,可见性越大,举一个案例,TRACE级别最低,所以说它可以看到的范围只能是它的级别,但是DEBUG级别的范围日志,则看到的是DEBUG+TRACE这两个级别范围的日志数据,一次类推即可。
日志级别介绍
日志级别可以从低到高分为:
- TRACE:用于输出程序运行时的详细信息,一般在调试程序时使用。
- DEBUG:用于输出调试信息,可以用来判断代码是否按预期执行。
- INFO:用于输出一些重要的运行时信息,可以用来确认程序运行是否正常。
- WARN:用于输出一些警告信息,不影响程序的运行但需要进行注意。
- ERROR:用于输出错误信息,会影响到程序运行。
此外还有两个特殊的日志级别:
- OFF:表示关闭全部日志。
- ALL:表示开启全部日志。
Logback的maven依赖
xml
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>x.y.z</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>x.y.z</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>x.y.z</version>
</dependency>
Logback的Logger详细介绍
在logback中,可以使用logger元素来定义一个日志输出器。logger元素的设置包括多个属性,其中包括:
- name:指定该logger的名称。
- level:指定该logger的日志级别。
- additivity:指示是否遵循缺省机制。
在additivity属性中,常见的有两种值:
- true:代表遵循缺省机制,即该logger和它的祖先logger都会被输出日志。
- false:代表该logger不遵循缺省机制,只有该logger会输出日志,而其祖先logger不会输出。
在logback中,还有一个特殊的logger,叫做Root Logger,它是所有logger的祖先logger。如果想要改变所有logger的默认行为,可以修改Root Logger的设置。
Root根上下文
使用Root元素可以为logback定义一个日志输出器。
Root元素的属性包括
- name: 定义logger的名字,以便被后文引用
- additivity: 取值为"true"(默认)或"false",用于控制logger是否继承父logger的属性
- level:定义该logger的日志级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
- appender-ref:Root的子节点,用于指定该日志输出到哪个Appender,通过ref指定。
Logger
可以使用Logger节点单独指定日志形式。它包括以下属性:
- name:用于指定该Logger所适用的类或者类所在的包全路径,继承自Root节点。
- additivity:用于控制Logger是否继承父Logger的属性。
- level:用于设置日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
- appender-ref:是Logger的子节点,用来指定该日志输出到哪个Appender。如果没有指定,就会默认继承自Root。如果指定了,日志将会在指定的这个Appender和Root的Appender中都会输出。此时,可以设置Logger的additivity="false",只在自定义的Appender中进行输出。
配置案例
xml
<loggers>
<!--默认的root的logger-->
<root level="DEBUG">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
<appender-ref ref="RollingFileDebug"/>
</root>
<!--额外配置的logger-->
<!--记录druid-sql的记录-->
<logger name="druid.sql.Statement" level="debug" additivity="false">
<appender-ref ref="druidSqlRollingFile"/>
</logger>
<!--log4j2 自带过滤日志-->
<Logger name="org.apache.catalina.startup.DigesterFactory" level="error" />
<Logger name="org.apache.catalina.util.LifecycleBase" level="error" />
<Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" />
<logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/>
<Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" />
<Logger name="org.crsh.plugin" level="warn" />
<logger name="org.crsh.ssh" level="warn"/>
<Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error" />
<Logger name="org.hibernate.validator.internal.util.Version" level="warn" />
<logger name="org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration" level="warn"/>
<logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
<logger name="org.thymeleaf" level="warn"/>
</loggers>
-
如果logger没有被分配级别,name它将从有被分配级别的最近的父类那里继承级别,root logger默认级别是DEBUG。
-
日志输出的时候,级别大的会输出,根据当前ROOT级别,日志输出时,级别高于root默认的级别时会输出,比如如果root的级别是info,那么会输出info以及info级别以上的日志。
Logback的Filter详细介绍
Logback提供了两类过滤器:Regular Filter和Turbo Filter。
Regular Filter
Regular Filter主要应用于Appender上,并且只在Appender级别起作用。Appender实例上可以绑定一个Regular Filter实例链。Regular Filter继承实现"ch.qos.logback.core.filter.Filter"类,自定义自己的Regular Filter需要继承"ch.qos.logback.core.filter.Filter"类,并实现decide()方法。
Turbo Filter
Turbo Filter对象绑定到日志记录上下文,因此不仅在使用给定的Appender时调用它们,而且每次都会发出日志记录请求。它们的范围比附加到Appender的过滤器更宽。更重要的是,它们在LoggingEvent对象创建之前被调用。Turbo Filter对象不需要实例化日志记录事件来过滤日志记录请求。因此,Turbo Filter旨在用于记录事件的高性能过滤,甚至在创建事件之前。要实现该类型的过滤器需要继承"ch.qos.logback.classic.turbo.TurboFilter"。
常见的过滤器
在logback中,经常使用3种常见的过滤器。
LevelFilter
级别过滤器(Level Filter)根据日志级别进行过滤。当日志级别与配置级别相同时,过滤器根据onMatch和onMismatch属性的配置来接收或拒绝日志事件。
根据精确的级别匹配过滤事件的是LevelFilter。如果事件的级别等于配置的级别,则过滤器接受或拒绝该事件,具体取决于onMatch和onMismatch属性的配置。
属性
<level>
:设置过滤级别<onMatch>
:用于配置符合过滤条件的操作<onMismatch>
:用于配置不符合过滤条件的操作
具体用法介绍
如果日志级别等于配置的级别,在满足onMatch设置的条件时,LevelFilter会接受该日志;反之,在满足onMismatch设置的条件时,LevelFilter会拒绝该日志。
具体案例分析
将过滤器的日志级别配置为INFO,所有等于INFO级别的日志交给appender处理,不等于INFO级别的日志,被过滤掉。
xml
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger{30} - %msg%n
</pattern>
</encoder>
</appender>
EvaluatorFilter
求值过滤器(EventEvaluator)用于评估、鉴别日志是否符合指定条件。它会评估给定的日志事件是否满足设定的条件,如果匹配或不匹配,则托管的EvaluatorFilter将分别返回在onMatch或onMismatch属性中指定的值。
需要注意的是,EventEvaluator是一个抽象类。若想实现自己的事件评估逻辑,可以通过对EventEvaluator进行子类化来实现。
属性
<evaluator>
:鉴别器通常用于过滤日志事件,其中常用的鉴别器是JaninoEventEvaluator,并且也是默认的鉴别器。该鉴别器可以接受任意布尔表达式作为条件进行求值,该表达式可以通过配置文件进行解析并动态编译。如果求值条件返回true,则表示该事件符合过滤条件。在配置过程中,鉴别器的表达式可以在子标签中进行配置。<onMatch>
:用于配置符合过滤条件的操作<onMismatch>
:用于配置不符合过滤条件的操作
具体用法介绍
EvaluatorFilter是求值过滤器,评估、鉴别日志是否符合指定条件。过滤掉所有日志消息中不包含"billing"字符串的日志。
xml
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator> <!-- 默认为 ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
<expression>return message.contains("billing");</expression>
</evaluator>
<OnMatch>ACCEPT </OnMatch>
<OnMismatch>DENY</OnMismatch>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger - %msg%n
</pattern>
</encoder>
</appender>
ThresholdFilter
临界值过滤器(ThresholdFilter)用于过滤掉低于指定临界值的日志。如果日志级别等于或高于临界值,则过滤器返回NEUTRAL。反之,如果日志级别低于临界值,则该日志会被拒绝。
需要注意的是,ThresholdFilter会过滤低于指定阈值的事件。对于等于或高于阈值的事件,ThresholdFilter将在调用decision()方法时响应NEUTRAL,但是将拒绝级别低于阈值的事件。
具体用法介绍
过滤掉所有低于INFO级别的日志。
xml
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- 过滤掉 TRACE 和 DEBUG 级别的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger{30} - %msg%n
</pattern>
</encoder>
</appender>
本文总结
Logback是一种Java日志框架,可以提供高度可配置的日志记录功能,包括级别控制和事件过滤等功能。它基于SLF4J(Simple Logging Facade for Java)日志抽象层,可以与多种流行的Java日志框架兼容,如Log4j和Java Util Logging。Logback的核心组件包括Logger、Appender和Layout,它们可以协同工作以产生可定制和易于理解的日志输出。Logback支持多种输出形式,例如控制台输出、文件输出等。它还支持异步日志记录和事件过滤器,可以高效地记录大量日志数据,并快速定位和解决问题。Logback还支持动态配置和可插拔式的架构设计,使得它非常易于使用和扩展。作为一种广泛应用于Java应用程序的日志框架,Logback的功能介绍非常重要。