【Java日志系列】Logback日志框架

news2024/11/29 0:53:43

目录

前言

一、Logback简介

二、Logback组件

三、快速入门

四、配置文件的使用

1. 配置文件中的标签

1.1 logger标签

1.2 root标签

1.3 appender标签

1.4 filter标签

1.5 encoder标签

1.6 property标签

2. 常见的Appender

2.1 ConsoleAppender

2.2 FileAppender

2.3 RollingFileAppender

2.3.1 TimeBasedRollingPolicy

2.3.2 FixedWindowRollingPolicy

3. 异步日志

总结 


前言

  日志是软件开发中不可或缺的一部分,它不仅能够帮助开发者了解应用程序运行的状态,还能在出现问题时提供诊断信息。Logback 是一个高效、灵活的日志框架,它由 Log4j 的创始人 Ceki Gülcü 开发,并且是 SLF4J (Simple Logging Facade for Java) 的默认实现。Logback 分为三个模块:core、classic 和 access,其中 classic 模块提供了丰富的日志功能。本文将介绍 Logback 的基本概念,包括其组件结构、快速入门、配置文件的使用、常见的 Appender 以及如何配置异步日志记录等功能。

一、Logback简介

  Logback是由Log4j创始人设计的又一个开源日志组件,当前分为三个模块:logback-core、logback-classic和logback-access,其中logback-core是其他两个模块的基础模块。logback-classic是log4j的一个改良版本,此外logbac-classic完整实现SLF4J API,使你开以很方便地更换成其他日志系统如log4j或JDK14 Loggin。logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。

二、Logback组件

Logger:日志的记录器,主要用于存放日志对象,也可以定义日志类型、级别。

Appender:用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等等。

Layout:负责把事件转换为字符串,格式化的日志信息的输出。在Logback中Layout对象封装在encoder中,也就是说我们配置文件中使用的encoder其实就是Layout。

三、快速入门

  首先,我们导入slf4j日志门面和logback的日志实现依赖:

<!-- slf4j依赖 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>2.0.13</version>
</dependency>
<!-- logback日志实现  logback-classic已经涵盖logback-core这个依赖了 -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.5.6</version>
</dependency>

  编写如下入门代码:

@Test
public void testQuick() {
    Logger logger = LoggerFactory.getLogger(LogbackTest.class);
    logger.error("error信息");
    logger.warn("warn信息");
    logger.info("info信息");
    logger.debug("debug信息");
    logger.trace("trace信息");
}

  运行结果如下图所示:

补充:logback有5种日志输出级别。分别是trace < debug < info < warn < error,其中debug是默认的日志级别。

四、配置文件的使用

  Logback提供了logback.groovy、logback-test.xml和logback.xml这三种配置文件(如果都不存在则采用默认的配置)。一般来说,我们会使用logback.xml来作为配置文件。Logback配置文件一般在springboot项目的src/main/resources目录下创建名为logback-spring.xml的文件。

1. 配置文件中的标签

1.1 logger标签

  logger是日志记录器,用来控制要输出哪些日志记录语句,对日志信息进行级别限制。有level属性、name属性、additivity属性,其中name属性必须要写,指定到哪一个类或者哪一个包,additivity表示是否向上一层传递打印信息,默认为true。可以包含 appender-ref 元素。下面是使用示例:

<configuration>
    <logger level="ERROR" name="com.example.testlog.LogTest" additivity="false">
        <appender-ref ref="STDOUT"></appender-ref>
    </logger>
</configuration>

1.2 root标签

  root标签指定最基础的的日志输出级别,它只有一个level属性,可以包含 appender-ref 元素。
level属性可以选择,ALL、TRACE、DEBUG、INFO、WARN、ERROR、NULL、OFF、INHERITED,下面是使用示例:

<configuration>
    <root level="debug">
        <appender-ref ref="STDOUT"></appender-ref>
    </root>
</configuration>

1.3 appender标签

  appender就是附加器,日志记录器会将输出的任务交给附加器完成,不同的附加器会将日志输出到不同的地方,例如控制台、文件、网络等。下面是使用示例:

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
</configuration>

补充(常见的附加器)

控制台附加器:ch.qos.logback.core.ConsoleAppender。
文件附加器:ch.qos.logback.core.FileAppender。
滚动文件附加器:ch.qos.logback.core.rolling.RollingFileAppender,属性有name、class,class用来指定附加器,name来表示当前附件器的名字。其他需要指定附件器的标签,可以通过appender-ref标签中的ref来指定。可以包含encoder元素、fileter元素等。

1.4 filter标签

  filter是过滤器,过滤器是附件器的一个组件,它是用于判断附件器是否输出日志的。一个附件器可以包含多个过滤器。过滤器只能有三个值,DENY、NEUTRAL、ACCEPT。DENY是不输出日志,NEUTRAL是不决定是否输出日志,ACCEPT是输出日志。

  在filter中 ,可以有三个元素,level元素、onMatch元素和onMismatch元素。其中,<level>用于设置过滤级别,<onMatch>用于配置符合过滤条件的操作,<onMismatch>用于配置不符合过滤条件的操作。下面是使用示例:

<configuration>
     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter>
            <level>info</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
</configuration>

1.5 encoder标签

  encoder最主要的就是pattern标签,用于控制输出日志的格式,常见的一些日志的输出格式如下面所示:

  • %-10level 日志级别 案例为设置10个字符,左对齐
  • %d {yyyy-MM-dd HH:mm:ss.SSS} 日期
  • %c 当前类全限定名
  • %M 当前执行日志的方法
  • %L 行号
  • %thread 线程名称
  • %m 或者%msg 信息
  • %n 换行
  • %logger 输出日志的类名
  • %logger{length} 对输出日志的类名缩写展示

  下面是一个encoder标签及输出格式的使用示例:

<encoder>
     <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>
</encoder>

1.6 property标签

  property标签用来定义变量, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值,下面是一个使用示例:

<property name="HOME" value="../log">

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <file>${HOME}/log.log</file>
</appender>

2. 常见的Appender

2.1 ConsoleAppender

  把日志添加到控制台,有以下子节点:

  • <encoder>:对日志进行格式化。
  • <target>:字符串 System.out 或者 System.err ,默认 System.out 。
<configuration>  
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">  
    <encoder>  
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>  
    </encoder>  
  </appender>  
  <root level="DEBUG">  
    <appender-ref ref="STDOUT" />  
  </root>  
</configuration>  

2.2 FileAppender

  把日志添加到文件,有以下子节点:

  • <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
  • <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
  • <encoder>:对记录事件进行格式化。
  • <prudent>:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是false。
<configuration>  
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">  
    <file>testFile.log</file>  
    <append>true</append>  
    <encoder>  
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>  
    </encoder>  
  </appender>  
  <root level="DEBUG">  
    <appender-ref ref="FILE" />  
  </root>  
</configuration>  

补充:除了将文件以.log的文本形式输出外,我们还可以将文件输出成html文件,相关配置如下图所示:

2.3 RollingFileAppender

  滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点:

  • <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
  • <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
  • <encoder>:对记录事件进行格式化。
  • <rollingPolicy>:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。
  • <triggeringPolicy>: 告知 RollingFileAppender 何时激活滚动。
  • <prudent>:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制:不支持也不允许文件压缩;不能设置file属性,必须留空。

  其中,对于滚动策略RollingPolicy,可以有以下两个策略:

2.3.1 TimeBasedRollingPolicy

TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责触发滚动。有以下子节点:

  • <fileNamePattern>:必要节点,包含文件名及“%d”转换符, “%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。如果直接使用 %d,默认格式是 yyyy-MM-dd。RollingFileAppender 的file子节点可有可无,通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。“/”或者“\”会被当做目录分隔符。
  • <maxHistory>:可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且<maxHistory>是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。
2.3.2 FixedWindowRollingPolicy

  FixedWindowRollingPolicy: 根据固定窗口算法重命名文件的滚动策略。有以下子节点:

  • <minIndex>:窗口索引最小值
  • <maxIndex>:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。
  • <fileNamePattern >:必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip

  下面是一个简单的示例,表示每天生成一个日志文件,保存30天的日志文件。

<configuration>   
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">   
     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">   
      <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>   
      <maxHistory>30</maxHistory>    
    </rollingPolicy>   
     <encoder>   
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>   
    </encoder>   
  </appender>    
  <root level="DEBUG">   
    <appender-ref ref="FILE" />   
  </root>   
</configuration>  

3. 异步日志

  所谓异步日志,系统会为日志操作单独分配出来一个线程,原来用来执行当前方法的主线程会继续向下执行,两个线程争夺CPU的使用权,在实际项目开发中,越大的项目对于日志的记录就越庞大,为了保证项目的执行效率,异步日志是一个很好的选择。下图是异步日志的一个使用示例:

总结 

  在本文中,我们介绍了 Logback 的基本概念和使用方法。从 Logback 的架构开始,我们了解到它分为 core、classic 和 access 三个模块,以及它与 SLF4J 的关系。接着通过快速入门的例子,展示了如何在项目中引入 Logback 并进行日志记录。随后,我们详细探讨了 Logback 的配置文件,包括常用的标签和属性,以及如何配置不同的 Appender 实现不同的日志输出需求。最后,我们还介绍了如何利用异步日志来提高程序性能。无论是简单的需求还是复杂的应用场景,Logback 都能提供强大的支持。随着对日志需求的增长和技术的发展,Logback 仍然是一个值得信赖的选择。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

瓜子二手车源码开发

瓜子二手车作为国内知名的二手车交易平台&#xff0c;其开发需求与功能架构主要围绕提升用户体验、保障交易安全、优化交易流程以及提供全面服务等方面展开。以下是对瓜子二手车开发需求与功能架构的详细分析 一、开发需求 用户需求&#xff1a; 便捷性&#xff1a;用户希望能…

ReTagList标签列表(API)

组件实现基于 Vue3 + Element Plus + Typescript,同时引用 vueUse + lodash-es + tailwindCss (不影响功能,可忽略) 基于ElTag实现的Tag列表,支持Tag列表多选,动态Tag列表 ReTagList标签列表 基础 简单展示Tag列表,可通过size指定尺寸 查看 /demo/tag-list/basic.md …

叉车门口拐角盲区防撞系统,精准微波距离测距,助力企业安全生产

叉车流动性强、作业场所不固定&#xff0c;是特种设备管理的薄弱环节。如何管住叉车、管好叉车&#xff0c;保障作业人员安全一直都是重点话题&#xff0c;引入智慧叉车&#xff0c;使用智能化监管&#xff0c;很多城市相继开展智慧叉车试点工作&#xff0c;给叉车装上“智慧大…

机械学习—零基础学习日志(如何理解概率论4)

当已知一个概率&#xff0c;求解另外一个函数的概率。以下是离散型的概率计算方法。 这里是连续型的&#xff0c;已知概念密度&#xff0c;计算对应的另外一个函数的概率。 这里需要求解对应的原始函数。 这里我们做一道练习题。 《概率论与数理统计期末不挂科|考研零基础入门…

精选这五款热门好用的骨传导耳机,帮你避免踩坑的麻烦!

相信大家都已经深有体会&#xff0c;拿那种常规的入耳式无线蓝牙耳机来做运动耳机&#xff0c;很难满足运动需要。如果选择前两年流行的颈挂式无线运动蓝牙耳机&#xff0c;虽然简单轻巧&#xff0c;但也是入耳式设计&#xff0c;长时间佩戴耳朵不舒服。这样看来&#xff0c;运…

科普篇 | 如何查找参考基因组信息

前 言 很多老师会发现&#xff0c;高通量测序后需要生信分析的过程中&#xff0c;需要填写一个信息分析表。而信息分析表中有一个对生信分析很重要的信息——基因组文件及注释文件。通常这类文件我们都是需要老师提供对应的下载链接&#xff0c;以便于生信直接利用这个链接去…

Git介绍及配置

目录 Git GitHub GitLab Gitee 配置Git 安装git 初次运行 Git 前的配置 注册一个代码托管平台 用户信息 获取 Git 仓库 初始化仓库 克隆现有的仓库 https方式&#xff1a; ssh方式&#xff1a; 上传本地项目至Git仓库 https方式 ssh-key方式 添加个人公钥​ …

【python】PyQt5中的QFrame控件,控制图形的边框样式、阴影效果、形状等属性

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【Redis】Redis 底层的数据结构(结合源码)

众所周知&#xff0c;Redis 是一个高性能的开源内存数据库&#xff0c;支持多种数据结构&#xff08;如字符串、哈希、列表和集合&#xff09;&#xff0c;提供持久化选项以确保数据安全&#xff0c;并具备高可用性和分布式功能。 下面我们就来了解一下其底层所使用到的数据结…

包装类和简单泛型

一、包装类 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java给每个基本类型都对应了一个包装类型。 1.1 基本数据类型和对应的包装类 注意&#xff1a;除了 Integer 和 Character&#xff0c; 其余基本类型的…

微信怎么恢复好友?找回失联好友,5个有效方法奉上!

微信&#xff0c;这个我们日常沟通不可或缺的工具&#xff0c;但有时会因为一些小疏忽&#xff0c;让我们不小心与好友失去了联系。可能是误删了好友&#xff0c;也可能是换了手机没来得及备份&#xff0c;导致那些熟悉的面孔从列表中消失。 那么&#xff0c;微信怎么恢复好友…

软件设计师全套备考系列文章9 -- 算法设计与分析

软考-- 软件设计师&#xff08;9&#xff09;-- 算法设计与分析 文章目录 软考-- 软件设计师&#xff08;9&#xff09;-- 算法设计与分析前言一、章节考点二、分治法三、回溯法四、贪心法五、动态规划法 前言 考试时间&#xff1a;每年5月、11月&#xff0c;软件设计师每年都…

当《黑神话:悟空》中的天命人,被AI换脸成老外…

前言 挡不住&#xff0c;根本挡不住&#xff01; 《黑神话&#xff1a;悟空》&#xff0c;这款由游戏科学公司制作的&#xff0c; 以中国神话为背景的角色扮演游戏&#xff0c;8月20日一上线&#xff0c; 就连续霸榜Steam、WeGame 等平台销量榜首&#xff0c; 肉饼的朋友圈…

软件测试学习笔记丨多表查询及子查询

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/31940 一、多表简介 定义&#xff1a;结合两个或多个表来执行SQL数据库操作&#xff0c;这通常涉及到一个或多个表的关联&#xff0c;基于某些共享的列&#xff08;通常是键&#xff09;之间…

C++面试基础系列-polymorphic多态性

系列文章目录 文章目录 系列文章目录C面试基础系列-polymorphic多态性Overview1.polymorphic多态性2.编译时多态的实现示例代码&#xff1a;函数重载示例&#xff1a;运算符重载示例&#xff1a;模板示例&#xff1a; 3.运行时多态的实现示例代码 4.编译时多态的优点关于作者 C…

高校考勤小程序的设计与实现---附源码131039

摘 要 随着计算机的发展及网络技术的应用&#xff0c;当今社会正快速向信息自动化社会前进&#xff0c;信息自动化的作用也闲的的尤为重要&#xff0c;特别是各行业的管理领域&#xff0c;智能化信息处理已是提高效率、规范管理、客观审查的最有效方法。近年来&#xff0c;随着…

双模显示器是什么?原来是可变化的显示屏

随着科技的进步和人们对高品质视觉体验需求的增加&#xff0c;显示技术正在经历一场深刻的变革。近年来&#xff0c;双模显示器逐渐引起了广泛关注&#xff0c;成为显示器设计的新趋势。那么什么是双模显示器呢&#xff1f;它都有哪些优势&#xff1f;下面就一起来了解一下。 …

C++学习笔记----4、用C++进行程序设计(三)---- 类间关系

作为一名程序员&#xff0c;会不可避免地碰到不同的类具有相同的特点&#xff0c;或者看起来相互之间有一定的关系。面向对象的编程语言提供许多技术来处理类间的这种关系。比较令人迷惑的部分就是理解 这些关系到底是什么&#xff1f;有两种主要的类间关系--复合关系&#xff…

【三维语义分割模型】PAConv

【版权声明】本文为博主原创文章&#xff0c;未经博主允许严禁转载&#xff0c;我们会定期进行侵权检索。 参考书籍&#xff1a;《人工智能点云处理及深度学习算法》 本文为专栏《Python三维点云实战宝典》系列文章&#xff0c;专栏介绍地址“【python三维深度学习】python…

780nm扫地机器人模组出现质量问题怎么检测?

随着智能家居的普及&#xff0c;扫地机器人已成为现代家庭不可或缺的清洁助手。其中&#xff0c;780nm扫地机器人模组作为扫地机器人的核心部件之一&#xff0c;其质量和性能直接影响到扫地机器人的整体表现。然而&#xff0c;在使用过程中&#xff0c;有时会遇到模组出现质量问…