SpringBoot的日志

SpringBoot的日志

  • 🔎日志是什么
  • 🔎日志的作用
  • 🔎日志级别
    • 日志级别的作用
    • 日志级别的分类
    • 日志级别的设置
  • 🔎打印日志
    • 打印日志
    • 具体内容划分
  • 🔎常用的日志框架
    • 为什么这样设计
    • 对比System.out.ptintln()与日志框架
  • 🔎日志的持久化
  • 🔎Lombok—更简单的打印日志
    • 对比得到日志的方式
    • 创建SpringBoot项目时忘记添加Lombok怎么办
  • 🔎结尾

🔎日志是什么


日志
记录软件运行状态, 事件和错误信息的一种机制

如图即为 Spring Boot 的日志

在这里插入图片描述

🔎日志的作用


  • 记录软件的运行状态, 错误信息, 警告信息
    (目的是为了在出现问题时能够快速定位和解决问题)
  • 分析软件的性能, 用户的行为
    (目的是为了优化软件产品)
  • 监控软件的运行情况
    (目的是为了保证软件的稳定性)

🔎日志级别


日志级别的作用


  1. 快速筛选出重要的日志
  2. 根据环境的不同设置不同的日志级别

举个栗子🌰

当前环境是开发环境, 通常设置的日志级别为 debug

当前环境是生产环境, 通常设置的日志级别为 warn / error

日志级别的分类


  • trace → 微量, 少许(级别最低)
  • debug → 调试
  • info → 普通的打印信息(默认日志级别)
  • warn → 警告⚠(出现警告不影响使用, 但需要注意警告的问题)
  • error → 错误
  • fatal → 致命的(不能自定义设置, 代码异常导致程序退出)

在这里插入图片描述

日志级别的设置


日志级别的设置通常在对应的环境中进行设置, 而不是直接在配置文件中设置

logging:level:root: error # root -> 设置全部的日志级别对应的包名:对印的类名: 设置对应类的日志级别

在这里插入图片描述

🔎打印日志


打印日志


打印日志分为 2 个步骤

  1. 得到日志
  2. 使用日志打印相关内容

得到日志🍂

private static final Logger log = LoggerFactory.getLogger(UserController.class);

对于getLogger(), 括号中的内容为日志的归属类
即打印的日志信息是关于哪个类的信息

使用日志打印相关内容🍂

log.trace("this is trace");
log.debug("this is debug");
log.info("this is info");
log.warn("this is warn");
log.error("this is error");

在这里插入图片描述

运行查看结果

在这里插入图片描述

结果分析🍂

想要显示的日志内容为 5 个, 分别是

  1. this is trace
  2. this is debug
  3. this is info
  4. this is warn
  5. this is error

运行结果却只显示其中 3 个

这是因为日志级别的缘故

默认的日志级别是 info
日志级别 ≥ 默认级别时才会被打印

具体内容划分


日志的内容可划分为 6 个部分

  • 日志的打印时间
  • 日志的级别
  • 线程Id
  • 线程名称
  • 日志归属的包名 + 类名
  • 日志的内容

在这里插入图片描述

🔎常用的日志框架


  • Spring Boot 内置的日志框架
    • SLF4J
    • logback

在这里插入图片描述

举个栗子🌰

将 Spring Boot 框架看作是餐厅
日志门面看作是餐厅的服务员
日志实现看作是餐厅的厨师

而我们则是来餐厅吃饭的顾客
顾客来到餐厅 → 喊服务员点餐 → 服务员将菜单送给厨师 → 厨师根据菜单做菜

在这个过程中顾客并不关心菜是如何制作的, 只要保证能将菜做好即可

Spring Boot 框架也是如此
程序员(顾客)来到餐厅 → 喊服务员(日志门面)点餐 → 服务员(日志门面)将菜单送给厨师(日志实现) → 厨师(日志实现)根据菜单做菜

为什么这样设计


根据上面的描述提出一个疑问
为什么这样设计?

解耦合

上述流程是这样的

程序员调用日志门面, 日志门面调用日志实现
(程序员 → 日志门面 → 日志实现)

但如果程序员直接调用日志实现
(程序员 → 日志实现)
则会面临如下情况

程序员编写对应的 logback 代码
有一天 logback 这个对应的接口出现了严重的 BUG
无奈之下, 只能更换为其他接口
由于之前一直使用 logback 这个接口, 因此需要修改的业务量比较庞大
(即使全部修改, 也会面临其他接口他日出现重复的问题)
这就导致了高耦合

对比System.out.ptintln()与日志框架


  1. System.out.ptintln() 能够打印信息, 但与日志框架相比, 缺少打印的时间, 信息的来源, 信息归属的包名 + 类名…
  2. System.out.ptintln() 只能将信息打印, 无法隐藏(日志框架可以通过设置日志的级别进行相关日志的隐藏 / 显示)

🔎日志的持久化


日志的持久化
将日志中的内容保存至指定位置的过程

name, 保存日志的名称(可省略, 省略则使用默认提供的名称spring.log)
path, 保存日志的路径(可省略, 省略则使用默认提供的路径)

logging:file:name: path: 

在这里插入图片描述

保存的指定路径 + 默认名称

注意🍂

保存的路径不存在时, 系统会自动创建

在这里插入图片描述

保存的默认路径 + 指定名称

在这里插入图片描述

在这里插入图片描述

注意🍂

日志的存储方式是追加而非覆盖

存储日志的最大容量默认为 10MB
超过该容量会自动创建一个新的文件进行存储

追加, 即在原日志文件的基础上继续存储新的日志内容(但超过 10MB 后会自动创建一个新的日志文件承接原日志文件)
覆盖, 即新的日志内容将原日志文件进行更替

在这里插入图片描述

🔎Lombok—更简单的打印日志


对比得到日志的方式


一般得到日志的方式🍭

private static final Logger log = LoggerFactory.getLogger(ArticleController.class);

Lombok 得到日志的方式🍭

@Slf4j

在这里插入图片描述

在这里插入图片描述

创建SpringBoot项目时忘记添加Lombok怎么办

  1. 引入插件
  2. 在 pom.xml 文件中进行添加

引入 EditStarters 插件

在这里插入图片描述

在 pom.xml 文件中单击右键 → Generate → Edit Starters → OK → 添加 Lombok

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

🔎结尾

创作不易,如果对您有帮助,希望您能点个免费的赞👍
大家有什么不太理解的,可以私信或者评论区留言,一起加油

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

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

相关文章

Observability:如何把 Elastic Agent 采集的数据输入到 Logstash 并最终写入到 Elasticsearch

在之前的文章 “安装独立的 Elastic Agents 并采集数据 - Elastic Stack 8.0”,我们详述了如何使用 No Fleet Server 来把数据写入到 Elasticsearch 中。在今天的文章中,我们来详述如下使用 Elastic Agents 在独立(standalone)模式…

《诸神之眼:Nmap网络安全审计技术揭秘》读书笔记

《诸神之眼:Nmap网络安全审计技术揭秘》读书笔记 作者:李华峰 ◆ 前言 NSE是Nmap中革命性的创新。通过Nmap强大的脚本引擎(NSE),每一个用户都可以向Nmap中添加自己编写的代码,从而将Nmap打造成用户自由定制…

fusionpbx简介

概述 fusionpbx是以freeswitch作为底层框架开发而成的开源PBX,在freeswitch的基础上,优化了GUI的易用性。 fusionpbx可用作高可用性的单租户或基于域的多租户 PBX、运营商级交换机、呼叫中心服务器、传真服务器、voip服务器、语音邮件服务器、会议服务…

深入理解深度学习——BERT派生模型:T5(Text to Text Transfer Transformer)

分类目录:《深入理解深度学习》总目录 T5的全称为Text to Text Transfer Transformer,是谷歌提出的预训练语言模型领域的通用模型,该模型将所有自然语言问题都转化成文本到文本的形式,并用一个统一的模型解决。为了得到大一统的高…

hexo stellar设置笔记页面

stellar主题的作者在其文档介绍了如何进行笔记页面的简单设置,但是我看了以后还是有点云里雾里,在一顿查阅资料以后,我终于找到了解决办法。 参考下面这个博主的文章。写得很详细,这里就不再赘述啦。 Stellar主题自定义侧边栏教…

C#,保持亮度的动态直方图均衡化(Brightness Preserving Dynamic Histogram Equalization:BPDHE)源代码

图像增强的主要目的是显示隐藏的图像细节,或者用新的动态范围增加图像对比度。直方图均衡(HE)是用于图像对比度增强的最流行的技术之一,因为HE在计算上快速且易于实现。HE通过基于输入灰度级的概率分布重新映射图像的灰度级来执行…

微服务远程调用openFeign整合

✅作者简介:大家好,我是Cisyam,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Cisyam-Shark的博客 💞当前专栏: 微服务探索之旅 ✨特色专…

聚类分析(文末送书)

目录 聚类分析是什么 一、 定义和数据类型 聚类应用 聚类分析方法的性能指标 聚类分析中常用数据结构有数据矩阵和相异度矩阵 聚类分析方法分类 二、K-means聚类算法 划分聚类方法对数据集进行聚类时包含三个要点 K-Means算法流程: K-means聚类算法的特点 三、k-med…

【数据挖掘】时间序列模型处理指南(二)

一、说明 本文是一个系列文章的第二部分,本文将用股票数据进行时间序列分析为例,对时间分析的方法、过程,进行详细阐述。 二、前文章节 在文章第一部分种:【数据挖掘】时间序列模型处理(一)_无水先生的博客…

C++ 文件和流

我们已经使用了 iostream 标准库,它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。 本教程介绍如何从文件读取流和向文件写入流。这就需要用到 C 中另一个标准库 fstream,它定义了三个新的数据类型: 数据类型描述of…

Java之Javac、JIT、AOT之间的关系

Javac:javac 是java语言编程编译器。全称java compiler。但这时候还是不能直接执行的,因为机器只能读懂汇编,也就是二进制,因此还需要进一步把.class文件编译成二进制文件。 Java的执行过程 详细流程 结论:javac编译后…

【ESP32C3合宙ESP32C3】:ESP32C3和合宙ESP32C3的环境搭建与离线包安装

项目场景: 最近买了一块合宙ESP32C3的开发板,于是想要开发一下,当然开发最开始少不掉开发环境的搭建,在这个搭建的过程中,遇到了一些问题,解决了,也希望能帮助到大家。 ESP32C3 和 合宙ES…