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

深入探索Logback日志框架的原理分析和开发实战指南系列

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>
  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种常见的过滤器。

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

相关推荐
躲在没风的地方8 天前
logback日志控制服务器日志输出
java·服务器·logback
ta叫我小白13 天前
Spring Boot 设置滚动日志logback
java·spring boot·spring·logback
代码的余温15 天前
Spring Boot集成Logback日志全攻略
xml·spring boot·logback
代码的余温16 天前
Logback.xml配置详解与实战指南
xml·logback
清风920016 天前
Logback——日志技术(基础)
java·前端·logback
代码的余温16 天前
MyBatis集成Logback日志全攻略
java·tomcat·mybatis·logback
秋千码途18 天前
小架构step系列08:logback.xml的配置
xml·java·logback
枣伊吕波22 天前
第十五节:第六部分:日志技术:logback的核心配置文件详解、日志级别
logback
再见晴天*_*23 天前
logback 日志不打印
java·服务器·logback
hi星尘1 个月前
Spring Boot + Logback MDC 深度解析:实现全链路日志追踪
spring boot·后端·logback