Spring Boot 日志:项目的“行车记录仪”

news2025/1/31 16:06:52

一、什么是Spring Boot日志

 (一)日志引入

在正式介绍日志之前,我们先来看看上篇文章中(Spring Boot 配置文件)中的验证码功能的一个代码片段:

  这是一段校验用户输入的验证码是否正确的后端代码, 仔细看,其中有以下三种异常情况,程序会返回false:

(1)用户输入的验证码为空或者没有输入验证码

(2)session为空

(3)验证码超时

  那么,当程序运行时,程序返回false时,我们并不知道到底是属于哪一种异常情况,因此,我们借助println方法,打印相关信息,以此来定位返回false返回的是哪种情况,比如,当控制台打印    ” 验证码超时 “ 时,我们就知道,此时返回false是因为验证码已经超时。

  通过这种打印信息的方式,可以帮助我们精准定位问题出现的原因,这里打印出来的信息,称为日志

  随着项目复杂度提升,我们对日志打印有更高需求,不仅用于定位排查问题,还需记录用户操作记录(部分审计公司有此要求)、记录用户喜好,将日志持久化后用于数据分析等。但 println 无法很好满足需求,需使用专门日志框架

当我们启动项目时,是不是经常会看到如下图的信息,其实这就是日志框架生成的日志!

(二)日志与行车记录仪

我们可以将日志类比为生活中的行车记录仪,它们在功能和作用上有很多相似之处:

  记录功能:行车记录仪会持续记录车辆行驶过程中的各种信息,比如行驶路线、速度、时间以及周围的路况等,就像日志会记录 Spring Boot 应用程序运行过程中的各种信息,包括方法调用、参数传递、执行时间和发生的事件等。


  问题排查:当车辆发生事故或者出现一些异常情况时,车主可以通过查看行车记录仪的记录来还原当时的场景,分析事故发生的原因或者车辆出现问题的可能因素。类似地,当 Spring Boot 应用出现故障或错误时,开发人员和运维人员可以通过查看日志来了解应用在故障发生前后的运行情况,快速定位问题所在,比如是哪个方法出现了异常,在什么时间、什么条件下出现的等。


  行为追溯:如果遇到一些纠纷,例如在判断是否发生追尾等事故责任时,行车记录仪的记录可以作为重要的证据,清晰地呈现车辆的行驶状态和相对位置等情况,帮助确定责任归属。在 Spring Boot 应用中,日志也可以用于追溯用户的操作行为和系统的响应过程,对于一些需要审计或者追踪的场景非常有用,比如记录用户的登录登出时间、对重要数据的修改操作等,以便在需要时进行查询和核对。


  性能评估:通过行车记录仪记录的行驶数据,比如在不同路段的行驶速度、停车次数等,还可以分析车辆的行驶性能和效率,判断是否存在行驶路线不合理或者车辆本身性能问题等。同样,通过分析 Spring Boot 应用的日志,能够评估应用的性能状况,例如某个接口的响应时间是否过长,数据库查询的频率是否过高,从而为性能优化提供依据。

(三)简单打印一个日志

接下来让我们学习一下如何使用日志框架来打印一个日志!

 

  由于程序是在main方法中运行的,因此线程名称是main;此外,在获取日志对象的时候,我们填入LoggerController.class作为参数,因此日志的来源类就是它,这样做可以让我们更加精准地定位日志来源于哪个类!

二、门面模式

(一)什么是门面模式

   在很久之前,市场上存在多种日志框架,如 Log4j、Logback、java.util.logging 等,它们的使用方式各不相同,比如日志框架1是使用log1()方法来打印日志的,日志框架2是使用log2()方法来打印日志的。

  那么在一个大型项目中,可能会有多个团队或开发者参与开发,如果没有统一的日志记录规范,不同团队可能会使用不同的日志框架,会导致代码风格和日志记录方式混乱。

  那么,该如何解决这个问题呢?

   虽然各大框架的使用方式不同,但是,我们是不是可以使用一个平台,让这个平台集成各种不同的日志框架,然后将不同框架中功能相同的方法,对外提供一个统一的接口,供程序员使用,这样就解决了代码风格不一致的问题。这种模式就叫 " 门面模式 "这里的平台就被称为——日志门面)。

  上面说的 slf4j 其实就是日志门面,为所有开发者提供了一套统一的日志记录接口,无论底层使用哪种日志框架,开发者都使用相同的方式记录日志,有助于保持代码的一致性和规范性,降低代码的学习和维护成本。

  门面模式(Facade Pattern)又称为外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。其主要特征是定义了一个高层接口,让子系统更容易使用。

(二)门面模式的实现

  下面我们来实现一个简单的门面模式,我们想象这样一个场景,当我们回家时,我们可能会打开客厅的灯,打开卧室的灯、打开走廊的灯……

  如果没有使用门面模式,我们需要一个一个走过去相应的场所去打开灯,那么,如果使用门面模式,我们就可以通过一个总开关,一次性打开所有地方的灯……

1、我们先定义客厅、卧室、走廊三个类,类中都有一个on()方法,用于打开灯

客厅类:

卧室类:

走廊类:

2、传统模式下开灯: 

  传统模式下开灯,我们需要在main方法中创建客厅、卧室、走廊三个类的实例,然后调用其       on()方法开灯,特别麻烦。 

3、门面模式下开灯: 

首先,我们定义一个门面,里面集成了客厅、卧室、走廊。

现在我们开灯的时候,就只需要实例Facade对象的实例,然后调用其on()方法即可开灯,比之前方便不少! 

  在这个案例中,我们可以把客厅、卧室、走廊类比为不同的日志框架,我们发现,即便是框架里面的方法名称改变了,比如客厅打开灯的方法名不是on(),而变成了livingOn()了,此时用户也无需去操心这种方法名变化对自己开发有什么影响,因为门面对外提供的接口还是on(),框架改变产生的影响,只需要门面去考虑,只要门面对外提供的接口不变,用户就无需去操心框架的改变带来的影响。

三、日志级别

(一)日志格式说明

  在前面打印日志的例子中,我简单介绍了一下日志的格式,接下来,我再正式的详细介绍一下日志格式,带大家深入了解一下,日志内容究竟包含了什么信息?

  这段日志是典型的 Spring Boot 应用程序启动日志,以下是对其格式的说明:

时间戳:日志的开头是时间戳,例如 2025-01-28T10:11:09.772+08:00,表示日志记录的时间,精确到毫秒,并且包含了时区信息(+08:00 表示东八区)。                                             
日志级别:紧接着时间戳的是日志级别,如 INFO,表示日志的重要程度。常见的日志级别还有 DEBUG、WARN、ERROR 等。                                                                                             
进程 ID:9852 是进程 ID,标识生成该日志的进程。                                                                       
线程名称:[spring_setting_test3] 是线程名称,表明该日志是由哪个线程产生的。通常是源代码的类名。                                                                                                                                        
日志记录器名称:中括号后面的内容,如 main 是日志记录器名称,用于标识日志的来源。            
日志内容:冒号后面的部分是具体的日志信息,描述了应用程序在启动过程中发生的事件,

(二)日志级别

  上面在介绍日志格式的时候,我们看到了“ 日志格式 “,那么,啥是日志级别呢?

  日志级别:是在软件开发和系统运维中用于对日志信息进行分类和分级的一种标准机制,大白话来说就是:日志级别就是对日志消息轻重程度进行了分级。

  就好像天气预报根据降雨的严重情况,对雨进行分级:小雨、大雨、暴雨、雷阵雨……同样,日志消息也有轻重缓急之分,有的消息只会记录一些小事,有些日志消息会记录一些程序奔溃的错误消息。

  日志的级别从高到低依次为:FATAL、ERROR、WARN、INFO、DEBUG、TRACE

FATAL:致命信息,表示需要立即被处理的系统级错误。                                                                
ERROR:错误信息,级别较高的错误日志信息,但仍然不影响系统的继续运行。                           
WARN:警告信息,不影响使用,但需要注意的问题。                                                                
INFO:普通信息,用于记录应用程序正常运行时的一些信息,例如系统启动完成、请求处理完成等。                                                                                                                                    
DEBUG:
调试信息,需要调试时候的关键信息打印。                                                                  
TRACE:
追踪信息,比 DEBUG 更细粒度的信息事件 (除非有特殊用意,否则请使用 DEBUG 级别替代)

(三)日志级别配置

 默认情况下,日志框架只会打印 info级别 或 info 级别以上级别的日志消息,因为如果打印info级别以下的日志消息记录的是一些繁琐的小事,因此默认不打印出来。

  观察上面的main方法,我们打印了除了FATAL级别的日志消息(日志框架没有提供FATAL级别的日志打印),但是运行程序时,只打印 INFO 级别或 INFO 级别以上的日志消息。 

  其实,这是日志配置的默认输出级别是 INFO ,程序只会默认输入这个级别或以上级别的日志,那么,既然是默认的,我们也可以自定义设置默认级别为其他级别。 

1、在yml文件中配置日志输出级别为DEBUG:

运行main方法:

   我们发现,虽然设置默认输出级别为debug,但是运行mian方法时,却没有打印出来debug级别的日志,这是为什么呢?

  这是因为,你手动运行main方法,配置文件对main方法是不起作用的,我们得通过url访问调用main方法,这样配置文件才会起作用。

代码修改:

Postman访问调用main方法: 

2、接下来我们在yml文件中配置日志输出级别为TRACE: 

Postman访问调用main方法: 

补充:因为FATAL级别的消息是致命消息,一旦出现,系统就无法正常运行。只要用户看到系统崩溃,就知道系统已经出现了致命错误,所有无需打印出来告知用户,因此日志框架没有提供FATAL级别的日志打印。 

四、日志(补充)

(一)日志持久化

  我们发现,一旦程序结束运行,我们之前的日志消息就全部被清空了。那么我们能不能生成一个日志文件,让它来记录日志信息呢?

  有的,兄弟,有的,像生成日志文件这样的的方法我们有两种,并且都是通过配置文件配置即可自动生成!

配置方法1:yml 配置日志文件名:

#配置日志文件名存储历史日志
logging:
  file:
    name: logger/springBoot.log

配置后启动项目,日志框架会生成 logger/springBoot.log 日志文件 

配置方法2:yml配置日志文件路径: 

#配置日志文件路径:会在D:/temp 路径下生成日志文件
logging:
  file:
    path: D:/temp

配置后启动项目,日志框架会在D:/temp路径下自动生成日志文件 

(二)更简单的日志输出

 前面教学的打印日志,我们需要创建一个日志对象,才可以打印日志,那么有没有什么更好的方法来打印日志呢?也是有的,兄弟!我们可以使用 @Slf4j 注解

旧方法:

新方法代码: 无需创建日志对象啦!直接使用!

Postman访问调用print方法:

 背后原理:

  @Slf4j注解 的作用是自动生成日志对象。在使用 @Slf4j 注解的类中,它相当于帮开发者自动添加了private final Logger log = LoggerFactory.getLogger(当前类名.class); 这行代码。 通过LoggerFactory.getLogger(当前类名.class)语句,以当前类作为参数初始化日志记录器,这样在打印日志时,就能明确日志信息出自哪个类。  

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

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

相关文章

【QT】 控件 -- 显示类

🔥 目录 [TOC]( 🔥 目录) 1. 前言 2. 显示类控件2.1 Label 1、显示不同文本2、显示图片3、文本对齐、自动换行、缩进、边距4、设置伙伴 3.2 LCD Number 3.3 ProgressBar 3.4 Calendar Widget 3. 共勉 🔥 1. 前言 之前我在上一篇文章【QT】…

冲刺蓝桥杯之速通vector!!!!!

文章目录 知识点创建增删查改 习题1习题2习题3习题4:习题5: 知识点 C的STL提供已经封装好的容器vector,也可叫做可变长的数组,vector底层就是自动扩容的顺序表,其中的增删查改已经封装好 创建 const int N30; vecto…

小米CR6606,CR6608,CR6609 启用SSH和刷入OpenWRT 23.05.5

闲鱼上收了一台CR6606和一台CR6609, 一直没时间研究, 趁春节假期把这两个都刷成 OpenWRT 配置说明 CPU: MT7621AT,双核880MHz内存: NT5CC128M16JR-EKI 或 M15T2G16128A, 256MB闪存: F59L1G81MB, 128MB无线基带芯片(BB): T7905DAN无线射频芯片(RF): MT7975DN无外置F…

SpringCloud系列教程:微服务的未来(十八)雪崩问题、服务保护方案、Sentinel快速入门

前言 在分布式系统中,雪崩效应(Avalanche Effect)是一种常见的故障现象,通常发生在系统中某个组件出现故障时,导致其他组件级联失败,最终引发整个系统的崩溃。为了有效应对雪崩效应,服务保护方…

大数据相关职位介绍之一(数据分析,数据开发,数据产品经理,数据运营)

大数据相关职位介绍之一 随着大数据、人工智能(AI)和机器学习的快速发展,数据分析与管理已经成为各行各业的重要组成部分。从互联网公司到传统行业的数字转型,数据相关职位在中国日益成为推动企业创新和提升竞争力的关键力量。以…

无人机红外热成像:应急消防的“透视眼”

无人机红外热成像:应急消防的“透视眼” 亲爱的小伙伴们,每年一到夏天,应急消防的战士们就像上紧了发条的闹钟,时刻准备应对各种灾害。炎热天气让火灾隐患“蹭蹭”往上涨,南北各地还有防洪救灾、台风、泥石流等灾害轮…

【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)

羑悻的小杀马特.-CSDN博客羑悻的小杀马特.擅长C/C题海汇总,AI学习,c的不归之路,等方面的知识,羑悻的小杀马特.关注算法,c,c语言,青少年编程领域.https://blog.csdn.net/2401_82648291?typebbshttps://blog.csdn.net/2401_82648291?typebbshttps://blog.csdn.net/2401_8264829…

AI在自动化测试中的伦理挑战

在软件测试领域,人工智能(AI)已经不再是遥不可及的未来技术,而是正在深刻影响着测试过程的现实力量。尤其是在自动化测试领域,AI通过加速测试脚本生成、自动化缺陷检测、测试数据生成等功能,极大提升了测试…

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion(代码)

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion(代码) 目录 手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion(代码)Stable Diffusion 原理图Stable Diffusion的原理解释Stable Diffusion 和Di…

新版231普通阿里滑块 自动化和逆向实现 分析

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向过程 补环境逆向 部分补环境 …

HTML一般标签和自闭合标签介绍

在HTML中,标签用于定义网页内容的结构和样式。标签通常分为两类:一般标签(也称为成对标签或开放闭合标签)和自闭合标签(也称为空标签或自结束标签)。 以下是这两类标签的详细说明: 一、一般标…

Eureka 服务注册和服务发现的使用

1. 父子工程的搭建 首先创建一个 Maven 项目&#xff0c;删除 src &#xff0c;只保留 pom.xml 然后来进行 pom.xml 的相关配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xs…

白嫖DeepSeek:一分钟完成本地部署AI

1. 必备软件 LM-Studio 大模型客户端DeepSeek-R1 模型文件 LM-Studio 是一个支持众多流行模型的AI客户端&#xff0c;DeepSeek是最新流行的堪比GPT-o1的开源AI大模型。 2. 下载软件和模型文件 2.1 下载LM-Studio 官方网址&#xff1a;https://lmstudio.ai 打开官网&#x…

《Origin画百图》之同心环图

《Origin画百图》第四集——同心环图 入门操作可查看合集中的《30秒&#xff0c;带你入门Origin》 具体操作&#xff1a; 1.数据准备&#xff1a;需要X和Y两列数据 2. 选择菜单 绘图 > 条形图&#xff0c;饼图&#xff0c;面积图: 同心圆弧图 3. 这是绘制的基础图形&…

蓝牙技术在物联网中的应用有哪些

蓝牙技术凭借低功耗、低成本和易于部署的特性&#xff0c;在物联网领域广泛应用&#xff0c;推动了智能家居、工业、医疗、农业等多领域发展。 智能家居&#xff1a;在智能家居系统里&#xff0c;蓝牙技术连接各类设备&#xff0c;像智能门锁、智能灯泡、智能插座、智能窗帘等。…

简易计算器(c++ 实现)

前言 本文将用 c 实现一个终端计算器&#xff1a; 能进行加减乘除、取余乘方运算读取命令行输入&#xff0c;输出计算结果当输入表达式存在语法错误时&#xff0c;报告错误&#xff0c;但程序应能继续运行当输出 ‘q’ 时&#xff0c;退出计算器 【简单演示】 【源码位置】…

自动化运维的未来:从脚本到AIOps的演进

点击进入IT管理资料库 一、自动化运维的起源&#xff1a;脚本时代 &#xff08;一&#xff09;脚本在运维中的应用场景 在自动化运维的发展历程中&#xff0c;脚本扮演着至关重要的角色&#xff0c;它作为最初的操作入口&#xff0c;广泛应用于诸多日常运维工作场景里。 在系统…

线程池以及在QT中的接口使用

文章目录 前言线程池架构组成**一、任务队列&#xff08;Task Queue&#xff09;****二、工作线程组&#xff08;Worker Threads&#xff09;****三、管理者线程&#xff08;Manager Thread&#xff09;** 系统协作流程图解 一、QRunnable二、QThreadPool三、线程池的应用场景W…

联想拯救者R720笔记本外接显示屏方法,显示屏是2K屏27英寸

晚上23点10分前下单&#xff0c;第二天上午显示屏送到&#xff0c;检查外包装没拆封过。这个屏幕左下方有几个按键&#xff0c;按一按就开屏幕、按一按就关闭屏幕&#xff0c;按一按方便节省时间&#xff0c;也支持阅读等模式。 显示屏是 &#xff1a;AOC 27英寸 2K高清 100Hz…

C++ deque(1)

1.deque介绍 deque的扩容不像vector那样麻烦 直接新开一个buffer 不用重新开空间再把数据全部移过去 deque本质上是一个指针数组和vector<vector>不一样&#xff0c;vector<vector>本质上是一个vector对象数组&#xff01;并且vector<vector>的buffer是不一…