深入理解 SpringBoot 日志框架:从入门到高级应用——(一)日志框架原理

news2025/2/10 8:10:15

文章目录

  • 了解日志框架
  • 常见日志框架
  • 面向 SLF4J 编程
    • SLF4J 接口规范
    • 其他框架统一转换为 SLF4J 框架

了解日志框架

日志框架的历史可以追溯到计算机编程的早期。在早期的编程语言中,如 C 和 Pascal,程序员通常使用 printf 或 fprintf 函数将程序的状态信息输出到控制台或文件中,以便调试和排查问题。

随着计算机应用程序的不断发展,人们对日志管理的需求越来越高。当我们在开发项目时,如果我们添加日志输出功能,我们就能更轻松的管理和维护项目:

  1. 日志框架可以提供更加丰富的日志管理功能,例如,可以设置日志的级别、输出位置、输出格式等。
  2. 日志框架可以记录应用程序的运行状态,当出现问题时,可以通过查看日志信息来定位问题所在,从而更加高效地进行调试和排查。
  3. 通过使用日志框架,程序员可以更加清晰地了解代码的运行情况,从而提高代码的可读性和可维护性。
  4. 对于大型应用程序,日志框架可以提供性能监控和优化功能,帮助程序员找出性能瓶颈并进行优化。

综上所述,使用日志框架可以帮助程序员更加高效地管理日志、调试和排查问题、提高代码的可读性和可维护性,以及优化应用程序的性能。

常见日志框架

常见的 Java 日志框架有 Log4j(reload4j)、Log4j2、Logback、JUL(JDK Logging)、SLF4J 等:

日志的接口抽象层日志的实现框架
JCL(Jakarta Commons Logging)
Jboos-loggingslf4j(Simple Logging Facade For Java)
JUL(java.util.logging)
Log4j(reload4j)
Log4j2
Logback

其中,Log4j 是 Apache 组织开发的日志框架,拥有丰富的配置选项和功能,但是在高并发情况下有可能出现性能问题,而由于2022年的 Log4j 出现的漏洞原因,Reload4j 成为 Log4j 的修复版本。Log4j2 是 Log4j 的升级版,继承了 Log4j 的优点,同时解决了性能问题,并添加了一些新的功能。Logback 是由 Log4j 的创始人 Ceki Gülcü 开发的日志框架,拥有和 Log4j 类似的配置方式,但是在性能和稳定性方面优于 Log4j。JUL(JDK Logging)是 JDK 自带的日志框架,使用方便,但是功能相对较弱。

SLF4J 是一个日志框架的门面(Facade)或者说抽象层,它不是具体的日志实现,而是为其他日志框架提供一个统一的接口,方便应用在不同的日志框架之间切换,(类似于 JDBC 和数据库的驱动之间的关系),从而达到面向 SLF4J 接口编程的目的。使用 SLF4J 可以有效地减少代码中对具体日志实现的依赖。

日志具体的实现框架在项目中可以配合日志的接口抽象层组合使用,也可以单独使用,常用的日志框架组合包括:

  1. SLF4J + Logback:SLF4J 是一个抽象日志接口,可以在不改变应用程序代码的情况下切换不同的日志实现,而 Logback 则是一个高效可靠的日志框架,可以与 SLF4J 无缝集成。
  2. Log4j2:Log4j2 是 Apache 开源组织发布的日志框架,具有高性能、异步日志、插件化等特点,可以与 Spring、Hibernate、MyBatis 等其他框架集成。
  3. Commons Logging + Log4j:Commons Logging 是一个通用的日志接口,可以在运行时自动选择最合适的日志实现,而 Log4j 则是一个流行的日志框架,可以与 Commons Logging 集成,提供可靠的日志记录功能。
  4. Log4j2 + SLF4J:Log4j2 与 SLF4J 结合使用,可以提供高性能的日志记录功能,并支持异步日志、插件化等特性。
  5. JUL(Java Util Logging):JUL 是 Java 标准库自带的日志框架,可以通过配置文件或编程方式进行配置,支持多种输出方式(控制台、文件、邮件等),但缺乏灵活性和可扩展性。

面向 SLF4J 编程

SLF4J 接口规范

SLF4J 官网:https://www.slf4j.org/

SLF4J 手册:https://www.slf4j.org/manual.html

开发的时候,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象层里面的方法。每一个日志的实现框架都有自己的配置文件。

SLF4J 就是基于此想法实现的一种日志记录框架,向外提供了Java 程序中的统一日志接口,可以方便地与各种日志系统(如 Log4j、Logback 和 java.util.logging、Log4j2)进行集成。

使用 SLF4J 以后,配置文件还是日志实现框架自己的配置文件。要切换日志记录框架,只需将 SLF4J 绑定为指定的日志框架即可。具体思想如图所示:

img

其他框架统一转换为 SLF4J 框架

通常,在我们的项目中所依赖的一些组件使用的是 SLF4J 以外的日志框架,如 Log4j、Log4j2 、JCL 和 JUL 等。为了应对这种情况,我们需要将其他框架统一转换为 SLF4J 日志框架,因此,SLF4J 为我们附带了用于处理这种情况的几个桥接模块,使用桥接器可以实现将对 Log4j、Log4j2 、JCL 和 JUL 等日志框架的调用转换为对 SLF4J 框架的调用,也就是狸猫换太子,之后在 SLF4J 框架之下再使用具体的日志框架。原理如图所示:

img

总体步骤如下:

  1. 首先,将原有的日志框架依赖进行排除
  2. 其次,添加新的日志框架的依赖;
  3. 使用桥接模块将记录日志框架桥接到 Slf4j,完成无感替换。

以下是将一些常见日志框架转换为 SLF4J 的方法:

  • Log4j 转换为 SLF4J 如果你使用的是 Log4j,可以使用 Log4j-to-SLF4J适配器,将 Log4j API 转换为 SLF4J API。只需要将 Log4j 的 jar 包替换为 Log4j-to-SLF4J 的 jar 包即可。
  • JUL(java.util.logging)转换为 SLF4J 如果你使用的是 JUL,可以使用 jul-to-slf4j 适配器,将 JUL API 转换为 SLF4J API。只需要添加 jul-to-slf4j 的 jar 包到你的项目中即可。
  • Logback 转换为 SLF4J 如果你使用的是 Logback,无需进行转换,因为 Logback 本身就实现了 SLF4J API。

当你将其他日志框架转换为 SLF4J 后,再使用 SLF4J 提供的各种日志实现,就可以统一管理你的应用的日志记录。

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

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

相关文章

总结898

今天在B站上看英文短视频,认识了一位著名的心理学家乔丹彼得森(号称“龙虾教授”)。他的思想对我 产生了一定的影响。 曾在《写作:自我精进的武器》中看到过写作的5大好处,但他没有乔丹彼得森所讲的那么令我震撼,他对写…

Django框架-1

框架介绍 框架是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法; 框架是可被应用开发者定制的应用骨架,是某种半成品; 使用框架开发的好处 开发周期短维护成本低软件生产效率和质量得到提高 Django框…

面向对象、封装、就近原则及this关键字

面向:拿、找; 对象:能干活的东西; 面向对象编程:拿东西过来做对应的事; 即,分别找对应的“对象”完成对应的“事件”。因此学习内容包括: ①学习各种已存在的对象并使用; ②学习设计对象并使用。 面向对象…

DAY21:二叉树(十一)二叉搜索树中的搜索+验证二叉搜索树(坑比较多,复盘)

文章目录 700.二叉搜索树中的搜索二叉搜索树概念二叉搜索树的搜索方式补充总结 思路递归法迭代法注意这里写if-if和if-else if的区别为什么if-if会访问空的root?if-if结构和if-else if-else的区别 迭代法修改结果: 98.验证二叉搜索树(坑比较多…

Java小知识

一、lambda ()->{} ()中为接口唯一方法中的参数,可以任意取 {}为接口唯一方法中的执行语句,返回的结果类型必须符合接口中方法返回值的定义 原理理解: Public interface Printable{ String print(String suffix);} 在函数式编程中有一个方…

【哈佛积极心理学笔记】第6讲 乐观主义

第6讲 乐观主义 How can we create consciously and subconsciously a positive environment, where we actually can take out the most moral, the most successful self to appreciate that self. Create a powerful positive situation to bring out the best in people.…

STM32——08-STM32感应开关盖垃圾桶

项目二:感应开关盖垃圾桶 项目需求 检测靠近时,垃圾桶自动开盖并伴随滴一声, 2 秒后关盖 发生震动时,垃圾桶自动开盖并伴随滴一声, 2 秒后关盖 按下按键时,垃圾桶自动开盖并伴随滴一声, 2 秒后…

DAY19:二叉树(九)路径总和+已知中后序构造二叉树

文章目录 112.路径总和思路伪代码完整版写法1写法1必须分开两个函数的原因注意点 完整版写法2写法2不涉及到回溯的原因 106.中序和后序遍历构造二叉树思路伪代码后序数组如何切割出左右区间写法注意区间切割注意中序和前序如何唯一构造二叉树后序和前序能否唯一构造二叉树&…

03-踏入程序诗意:Golang 流程控制的优雅律动

📃个人主页:个人主页 🔥系列专栏:Golang基础 💬Go(又称Golang)是由Google开发的开源编程语言。它结合了静态类型的安全性和动态语言的灵活性,拥有高效的并发编程能力和简洁的语法。G…

Linux 安装Docker完整教程(六)

文章目录 背景一、Docker简介二、docker desktop 和 docker engin 区别三、Linux 安装Docker1. 安装docker的前置条件:2. 查看Docker版本3. 检查是否安装过Docker4. Docker的自动化安装 (不想自带化安装的可跳过本步骤,选择手动安装)5. Docker手动安装&a…

第二章CompletableFuture

文章目录 Future和Callable接口FutureTask实现类为什么引出FutureTask Future到CompletableFutureFuture优点Future的缺点get()阻塞isDone()轮询Future应用现状 CompletableFuture基本介绍CompletionStage核心的四个静态方法(分为两组)runAsync无返回值s…

数字人解决方案——实时对话数字人源码与环境配置

前言 1.从技术角度来看,现在的数学人就是一个缝合怪,把各种技术点都整合在一起,用来实现直播、对话等数字人。技术流程大概如下图: 其实最重要的一环应该属于LLM(大型语言模型),LLM相当于一个人的意识,如果…

外卖订单管理系统(Javaweb+Mysql)

程序源码 可以通过上方代码包.rar文件下载,也可以在下方链接下载 链接: https://pan.baidu.com/s/1OruBEcEK70DtUbvA8UIE-w?pwddkdg (数据库sql文件在项目根目录下data -> sql) 设计报告 【金山文档】 外卖订单管理系统设计报告 http…

编译原理期末速成–正规式、NFA转DFA、DFA的简化

编译原理期末速成–正规式、NFA转DFA、DFA的简化 文章目录 编译原理期末速成--正规式、NFA转DFA、DFA的简化什么是DFA、NFA?看个题消化一下步骤一:步骤二:步骤三:步骤四:步骤五:步骤六:步骤七&a…

POJ The Game

原题目:传送锚点 1.题目 The Game Description A game of Renju is played on a 19*19 board by two players. One player uses black stones and the other uses white stones. The game begins in an empty board and two players alternate in placing black …

面对工作中的失误:从错误中学习与成长

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。😊 座右铭:不想…

C99的一些新特性记录

固长类型头文件<stdint.h> 由于历史原因&#xff0c;C语言中实现的整型数只保证了在不同硬件体系中的最小长度&#xff0c;因此在使用时&#xff0c;需要根据代码实际运行的平台来确定类型的长度&#xff0c;这导致代码非常不方便移植。C99标准通过增加固长类型头文件引入…

【Unity3D】屏幕深度和法线纹理简介

1 前言 1&#xff09;深度纹理和法线纹理的含义 深度纹理本质是一张图片&#xff0c;图片中每个像素反应了屏幕中该像素位置对应的顶点 z 值相反数&#xff08;观察坐标系&#xff09;&#xff0c;之所以用 “反应了” 而不是 “等于”&#xff08;或 “对应” &#xff09;&am…

chatgpt赋能python:Python浮点型转换为整型的方法和应用场景

Python浮点型转换为整型的方法和应用场景 介绍 Python的浮点型和整型在数值计算中应用广泛。有时候我们需要将一个浮点数转换为整数&#xff0c;这时候就需要使用Python提供的一些函数来完成转换。本文将介绍Python浮点型转换为整型的方法和应用场景。 浮点型和整型的区别 …

初探MyBatis实现简单查询

一、创建数据库与表 1、创建数据库 在Navicat里创建MySQL数据库 - testdb&#xff0c;采用utf8mb4字符集 2、创建用户表 CREATE TABLE t_user (id int(11) NOT NULL AUTO_INCREMENT,name varchar(50) DEFAULT NULL,age int(11) DEFAULT NULL,address varchar(255) DEFAULT…