SpringBoot的日志

news2024/10/5 13:10:40

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.coloradmin.cn/o/661604.html

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

相关文章

Kubernetes那点事儿——暴露服务之Ingress

Kubernetes那点事儿——暴露服务之Ingress 前言一、ingress负载均衡器Ingress Controller路由规则Ingress 二、Ingress Controller三、案例 前言 在 k8s 集群中,如果我们将服务暴露出来,提供访问,可以使用Nodeport方式,但是Nodepo…

SIG Mesh协议学习

1. 简介 Bluetooth SIG组织在2017年7月17日发布了蓝牙Mesh标准. 蓝牙Mesh不同于传统Bluetooth Low Energy(BLE)协议的1对1, 1对多的通信方式, 它实现了多对多的通信. 这使得mesh网络中的各个节点之间可以相互通信. 蓝牙Mesh协议建立在BLE的物理层和链路层之上, 也就是说它可以…

MachXO2系列 FPGA LCMXO2-7000HC-4TG144C-可编程逻辑器件介绍

莱迪思深力科MachXO2系列LCMXO2-7000HC-4TG144C是高度可配置的串行逻辑器件(PLD),具有低误差,具有和高系统集成等特性。MachXO2系列逻辑密度增加了3倍,嵌入存储增加了10倍,静态降低100倍,而成本…

动态获取项目根目录的两种方式

说明:如果项目上传的文件是存储在本地的,为了项目可以在其他电脑上也可能正常运行,可以将文件上传至项目的static文件夹里,并将文件路径保存至数据库中,前端显示时使用也可以通过该路径访问。要想获取到本地项目static…

如何评估大型语言模型(LLM)?

编者按:近期几乎每隔一段时间,就有新的大语言模型发布,但是当下仍然没有一个通用的标准来评估这些大型语言模型的质量,我们急需一个可靠的、综合的LLM评估框架。 本文说明了为什么我们需要一个全面的大模型评估框架,并…

DOCker安装(一)

DOCker的安装 1、简介 Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。 Docker容器通过Docker镜像来创建。 容器之间互不干扰 容器与镜像的关系类似于面向对象编程中的对象与类。 对象->容器 镜像->类 通过镜像来创建容器 …

如何用MarkDown轻松排版和格式化文档?

前言 大家好哦!我写作用的语言是MarkDown,真的非常好用,在本文中我将一字字的教你如何使用这个轻量化,容易上手的轻标记语言。 1. 什么是MarkDown MarkDown是一种轻量级的标记语言,它可以在文本中通过简单的标记实现…

基于Java+SpringBoot+Vue+uniapp微信小程序实现仓储管理系统

博主介绍:✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

OpenHarmony端云一体化应用开发快速入门练习(上)基础配置

一 、整体说明 SDK版本更新说明 二、开发流程 集成SDK (一)前提条件 安装HUAWEI DevEco Studio 3.1及以上版本,配置 SDK API Version 9及以上,Compile SDK Version 9及以上,Compatible SDK Version 9及以上。 &#…

mpi实现矩阵乘法,卷积,池化(gemm,covn,pooling)

矩阵乘法: 卷积: 池化: Mpi基本原理: 1.什么是MPI Massage Passing Interface:是消息传递函数库的标准规范,由MPI论坛开发。 一种新的库描述,不是一种语言。共有上百个函数调用接口,提供与C和F…

【Rust日报】2023-06-16 Rust在Stack Overflow上连续8年成为最受欢迎语言(文末有彩蛋)...

推荐23个Rust Top开源项目 根据LibHunt网站Rust主题下有关统计,这里列出前5个Rust Top开源项目:deno、rust、tauri、alacritty、rustdesk。 阅读更多:Top 23 Rust Open-Source Projects https://www.libhunt.com/topic/rust Tweets&#xff1…

微信小程序触底加载scroll-view

微信小程序触底加载 scroll-view 了解什么是触底加载? 需求:有个固定高度的容器,实现容器里面的内容触底加载 1、内容盒子的高度 2、盒子里内容的总高度 3、滚动条的scrollTop 触底加载的原理就是 当里面的容器触底的时候进行分页&#xff0…

【题解】[ABC306G] Return to 1(数论)

【题解】[ABC306G] Return to 1 题目链接 ABC306G - Return to 1 题意概述 本题多测,\(T\) 组数据。 对于每组数据,给定一个 \(n\) 个点 \(m\) 条边的有向图,无重边自环。 问从顶点 \(1\) 出发,能否恰好走 \({10^{10}}^{100}\) 步…

【八大排序(七)】归并排序初级篇-递归版

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:八大排序专栏⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习排序知识   🔝🔝 归并排序 1. 前言2. 归并排序基本思路3. …

在数组中各位置上计算该位置以前所有元素的累加结果(Nan值视为0)numpy.nancumsum()

【小白从小学Python、C、Java】 【等级考试500强双证书考研】 【Python-数据分析】 在数组中各位置上计算该位置以前 所有元素的累加结果(Nan值视为0) numpy.nancumsum() [太阳]选择题 以下说法错误的是: import numpy as np a np.array([[n…

使用兮克 2.5G 交换机将北京联通 EPON 改为 ODI 猫棒接入

使用兮克 2.5G 交换机将北京联通 EPON 改为 ODI 猫棒接入 最近入手了兮克2.5G交换机(兮克SKS1200-8GPY1XF),有 8 个 2.5G 电口和 1 个 10G SFP 光口;支持多种组网模式,其中一种是支持使用猫棒接入,由路由器…

聊聊微服务到底该如何划分

背景 现在动不动就是微服务架构,但是微服务划分的合理与否会极大的影响开发过程中的复杂度,划分的重要性不言而喻,但是在微服务划分这条路上并没有银弹,有的说DDD可以解决微服务的划分问题,吕哥想说的是那只是理论上的…

Linux常用命令——gcc命令

在线Linux命令查询工具 gcc 基于C/C的编译器 补充说明 gcc命令使用GNU推出的基于C/C的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化等特点。现在很多程序员都应用GCC,怎样才能更好的应用GCC…

Linux---上传和下载、压缩和解压

1. 上传下载 可以通过FinalShell工具,方便的和虚拟机进行数据交换。 在FinalShell软件的下方窗体中,提供了Linux的文件系统视图,可以方便的: 浏览文件系统,找到合适的文件,右键点击下载,即可…

STL中set与map介绍

目录 一. 键值对1. 关联式容器2. pair3. 应用场景 二. set1. set的介绍2. set的使用3. multiset的介绍 三. map1. map的介绍2. map的使用3. multimap的介绍 一. 键值对 ​ 用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value。key代表键…