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

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

  • Logback日志框架
  • Logback基本模块
    • logback-core
    • logback-classic
    • logback-access
    • Logback的核心类
      • Logger
      • Appender
      • Layout
        • Layout和Appender
      • filter
      • logback模块和核心所属关系
    • Logbackj日志级别
      • 日志输出级别
        • 日志级别介绍
    • Logback的maven依赖
    • Logback的Logger详细介绍
      • Root根上下文
        • Root元素的属性包括
      • Logger
      • 配置案例
    • Logback的Filter详细介绍
      • Regular Filter
      • Turbo Filter
      • 常见的过滤器
        • LevelFilter
          • 属性
          • 具体用法介绍
          • 具体案例分析
        • EvaluatorFilter
          • 属性
          • 具体用法介绍
        • ThresholdFilter
          • 具体用法介绍
  • 本文总结

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依赖

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

配置案例

<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级别的日志,被过滤掉。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/283525.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】树状数组总结

知识概览 树状数组有两个作用&#xff1a; 快速求前缀和 时间复杂度O(log(n))修改某一个数 时间复杂度O(log(n)) 例题展示 1. 单点修改&#xff0c;区间查询 题目链接 活动 - AcWing本活动组织刷《算法竞赛进阶指南》&#xff0c;系统学习各种编程算法。主要面向…

如何使用JavaScript 将数据网格绑定到 GraphQL 服务

前言 作为一名前端开发人员&#xff0c;GraphQL对于我们来说是令人难以置信的好用。它可以用来简化数据访问&#xff0c;这让我们的工作变得更加容易。 什么是 GraphQL&#xff1f;它是一个抽象层&#xff0c;位于任意数量的数据源之上&#xff0c;并为您提供一个简单的 API …

为什么选择计算机?大数据时代学习计算机的价值探讨

还记得当初自己为什么选择计算机? 计算机是在90年代兴起的专业,那时候的年轻人有驾照、懂外语、懂计算机是很时髦的事情! 当初你问我为什么选择计算机,我笑着回答:“因为我梦想成为神奇的码农!我想像编织魔法一样编写程序,创造出炫酷的虚拟世界!”谁知道,我刚入门的…

UE5 第三人称游戏模板白屏问题

文章目录 问题背景问题解决解决方法一解决方法二解决方法三解决方法四 问题背景 在虚幻引擎5创建第三人称游戏模板时&#xff0c;打开场景显示白屏&#xff0c;物体可以点击选中&#xff0c;出现类似这种问题&#xff0c;考虑是曝光的原因&#xff0c;在确定引擎没有问题的情况…

C语言—小小圣诞树

这个代码会询问用户输入圣诞树的高度&#xff0c;然后根据输入的高度在控制台上显示相应高度的圣诞树。 #include <stdio.h>int main() {int height, spaces, stars;printf("请输入圣诞树的高度: ");scanf("%d", &height);spaces height - 1;st…

D3132|贪心算法

435.无重叠区间 初始思路&#xff1a; 我的思路就是如果有两个区间重叠&#xff0c;保留end比较小的那个区间&#xff0c;删除end比较大的区间。 class Solution {public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals, new Comparator<int[]>…

CentOS7安装Docker及添加阿里云镜像加速详细教程

Docker官方安装教程网站&#xff1a;Install Docker Engine on CentOS | Docker Docs 具体流程如下&#xff1a; 1.确定你是CentOS7及以上版本 cat /etc/redhat-release 2.yum安装gcc相关 yum -y install gcc yum -y install gcc-c 3.安装需要的软件包 3.1安装docker引擎…

力扣刷题-二叉树-找树左下角的值

513 找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1&#xff1a; 示例 2&#xff1a; 思路 层序遍历 直接层序遍历&#xff0c;因为题目说了是最底层&#xff0c;最左边的值&a…

配置策略路由(基于IP地址)示例

策略路由简介 定义 策略路由PBR&#xff08;Policy-Based Routing&#xff09;是一种依据用户制定的策略进行路由选择的机制&#xff0c;其优先级高于直连路由、静态路由和通过动态路由协议生成的路由。设备配置策略路由后&#xff0c;若接收的报文&#xff08;包括二层报文&…

LCR 146. 螺旋遍历二维数组

解题思路&#xff1a; class Solution {public int[] spiralArray(int[][] array) {if(array.length 0) return new int[0];int l 0, r array[0].length - 1;int t 0, b array.length - 1;int x 0;int[] res new int[(r 1) * (b 1)];while(true) {for(int i l; i <…

geemap学习笔记028:Landsat8计算时间序列NDVI并导出

前言 本节则是以Landsat8影像数据为例&#xff0c;进行NDVI时间序列计算&#xff0c;并将得到的时间序列NDVI进行展示并导出。 1 导入库并显示地图 import ee import geemap import datetime import pandas as pd import os ee.Initialize()2 定义时间范围 # 定义日期范围 …

c语言:判断是否为整数|练习题

一、题目 输入一个数字&#xff0c;判断该数字是否为整数 如图&#xff1a; 二、思路分析 1、没有小数部分的数字&#xff0c;即为整数。所以&#xff0c;只要知道该数字是否有小数部分&#xff0c;即可。 2、例子&#xff1a;1.5减去10.5&#xff0c;由于有小数部分&#xff0…