likes
comments
collection
share

【Logback技术专题】「入门到精通系列教程」深入探索Logback日志框架的原理分析和开发实战技术指南(上篇)

作者站长头像
站长
· 阅读数 9

Logback日志框架

"Logback"是一个开源的日志组件,它的设计者也是"Log4j"的作者。相比于"Log4j",它拥有更好的特性,因此成为了一个取代"Log4j"的优秀的日志框架。如果您正寻找一款优秀的日志组件,那么"Logback"将是一个不错的选择。

Logback基本模块

【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的核心类

【Logback技术专题】「入门到精通系列教程」深入探索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模块和核心所属关系

【Logback技术专题】「入门到精通系列教程」深入探索Logback日志框架的原理分析和开发实战技术指南(上篇)

Logbackj日志级别

Logback 日志框架共有5种级别,分别为 TRACE 、 DEBUG 、 INFO 、 WARN 、 ERROR,这些级别均被定义在ch.qos.logback.classic.Level类中。

日志输出级别

日志级别可以分为五个等级,从低到高依次为:TRACE < DEBUG < INFO < WARN < ERROR。 【Logback技术专题】「入门到精通系列教程」深入探索Logback日志框架的原理分析和开发实战技术指南(上篇) 从上面可以看出,等级高的级别,可见性越大,举一个案例,TRACE级别最低,所以说它可以看到的范围只能是它的级别,但是DEBUG级别的范围日志,则看到的是DEBUG+TRACE这两个级别范围的日志数据,一次类推即可。

日志级别介绍

日志级别可以从低到高分为:

  • TRACE:用于输出程序运行时的详细信息,一般在调试程序时使用。
  • DEBUG:用于输出调试信息,可以用来判断代码是否按预期执行。
  • INFO:用于输出一些重要的运行时信息,可以用来确认程序运行是否正常。
  • WARN:用于输出一些警告信息,不影响程序的运行但需要进行注意。
  • ERROR:用于输出错误信息,会影响到程序运行。

此外还有两个特殊的日志级别:

  • OFF:表示关闭全部日志。
  • ALL:表示开启全部日志。

Logback的maven依赖

<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元素的属性包括

【Logback技术专题】「入门到精通系列教程」深入探索Logback日志框架的原理分析和开发实战技术指南(上篇)

  • 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中进行输出。

配置案例

<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>
  1. 如果logger没有被分配级别,name它将从有被分配级别的最近的父类那里继承级别,root logger默认级别是DEBUG。

  2. 日志输出的时候,级别大的会输出,根据当前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种常见的过滤器。 【Logback技术专题】「入门到精通系列教程」深入探索Logback日志框架的原理分析和开发实战技术指南(上篇)

LevelFilter

级别过滤器(Level Filter)根据日志级别进行过滤。当日志级别与配置级别相同时,过滤器根据onMatch和onMismatch属性的配置来接收或拒绝日志事件。

根据精确的级别匹配过滤事件的是LevelFilter。如果事件的级别等于配置的级别,则过滤器接受或拒绝该事件,具体取决于onMatch和onMismatch属性的配置。

属性
  • <level>:设置过滤级别
  • <onMatch>:用于配置符合过滤条件的操作
  • <onMismatch>:用于配置不符合过滤条件的操作
具体用法介绍

如果日志级别等于配置的级别,在满足onMatch设置的条件时,LevelFilter会接受该日志;反之,在满足onMismatch设置的条件时,LevelFilter会拒绝该日志。

具体案例分析

将过滤器的日志级别配置为INFO,所有等于INFO级别的日志交给appender处理,不等于INFO级别的日志,被过滤掉。

<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”字符串的日志。

<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级别的日志。

<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的功能介绍非常重要。