【Spring Boot】Spring Boot日志详情:基于lombok的日志输出

文章目录

  • 1. 何为日志文件?
  • 2. 日志文件的作用
  • 3. 日志文件的基本使用
    • 3.1 Spring Boot中的日志
    • 3.2 自定义日志打印
  • 4 日志级别
    • 4.1 日志级别的作用
    • 4.2 日志级别的分类
    • 4.3 日志级别的设置
  • 5 日志持久化
  • 6 基于lombok的日志输出
    • 6.1 lombok 简单输出日志案例
    • 6.2 浅谈 lombok 原理
  • 写在最后


1. 何为日志文件?

日志文件是一种记录计算机系统或应用程序运行状态和活动的文件。日志文件可以包含各种重要信息,如错误报告、警告、事件、用户活动等。日志文件通常用于故障排除、性能优化、安全审计和法律合规等方面。日志文件可以在本地存储,也可以通过网络传输到远程服务器进行集中存储和分析。对于大型系统和应用程序,日志文件通常很大,需要专门的工具和技术来处理和分析。

简单点儿来说,日志文件就是帮助我们记录程序开发或者使用过程中的一些必要信息,帮助我们进行后期的维护和纠错~


2. 日志文件的作用

日志是程序的重要组成部分,最主要的作用就是帮助我们 排除和定位问题, 除此之外,还有如下常用功能:

  • 记录⽤户登录⽇志,⽅便分析⽤户是正常登录还是恶意破解⽤户。
  • 记录系统的操作⽇志,⽅便数据恢复和定位操作⼈。
  • 记录程序的执⾏时间,⽅便为以后优化程序提供数据⽀持。

在日常开发中,日志也被广泛使用:

  1. 调试和故障排除:当代码出现问题时,日志可以帮助开发人员确定问题所在,信息包括错误消息、异常堆栈和变量值。开发人员可以利用这些信息快速定位问题。

  2. 性能分析和优化:日志中可以记录程序的运行时间、内存使用情况和磁盘IO等信息。开发人员可以利用这些信息来寻找性能瓶颈,并优化代码以提高性能。

  3. 安全监控:日志可以记录系统和应用程序的访问情况、用户行为,以及异常登录等信息。这些日志数据有助于开发人员监控和检测潜在的安全问题。

  4. 操作审计:日志可以记录用户的操作,包括登录、退出、修改记录等。这些日志可以用于审计和追踪用户活动。

  5. 运维和监控:日志可以用于监控应用程序的运行状态,并在系统出现异常时通知运维人员。开发人员也可以使用日志来跟踪应用程序的版本和部署情况。

总之,日志是开发中不可或缺的一部分,它可以帮助开发人员快速排查问题,优化性能,并保证应用程序的安全和可靠性。
表情包


3. 日志文件的基本使用

3.1 Spring Boot中的日志

Spring Boot 项⽬在启动的时候默认就有⽇志输出,如下图所示:
SpringBoot日志
可见,Spring Boot内置了日志框架,从而能完成日志在控制台的打印。那么问题就来了,同样是在控制台打印,为什么不使用System.out.print打印呢? 答案是显然的:

  • 使用System.out.print,并不支持日志级别(后面会讲);
  • 使用System.out.print,是会将信息打印到控制台,但是我们并不清楚是哪个类,是什么原因,以及时间等信息,且打印的信息非常多,达不到日志所需要的快速定位问题所在的功能。

还有一个问题,在控制台打印的日志是不能被永久保存的,怎么把⽇志永久的保存下来呢? 别急,带着问题我们继续往后看~
表情包

3.2 自定义日志打印

自定义日志打印主要步骤如下:

  1. 获取日志对象
  2. 使用日志对象的相关方法输出要打印的内容

获取日志对象
在程序中获取⽇志对象需要使⽤⽇志⼯⼚ LoggerFactory,代码如下:

// 1. 得到日志对象
private final Logger logger = LoggerFactory.getLogger(UserController.class);

其中,getLogger方法需要传入当前类,用于说明日志归属类,便于我们更加直观的定位到问题类。同时,需要注意的是,Logger 对象属于 org.slf4j 包下。

使用日志对象打印日志
日志对象的打印方法有很多,示例代码如下:

// 2. 写日志的方法
@RequestMapping("/hi")
public String sayHi() {// 写日志logger.trace("我是 trace");logger.debug("我是 debug");logger.info("我是 info");logger.warn("我是 warn");logger.error("我是 error");return "Hi, Spring Boot.";
}

实现结果:
打印日志
可以看到,使用了 5 种不同的方法打印日志信息,但是,控制台只打印了其中的三种,这是由于日志级别的设置造成的,具体后面详细说明。同时,通过控制台打印的信息我们可以看出,一条日志信息包含时间、日志的级别、线程ID、线程名称、日志归属的包和类以及日志的内容。


4 日志级别

4.1 日志级别的作用

日志级别的作用在于通过设置不同级别的日志来查看不同严重程度的问题信息,方便定位问题,快速排除问题。比如在生产环境中,一般只记录INFO及以上级别的日志,这样可以减少日志量,避免影响系统性能。而在调试过程中,一般会开启DEBUG级别的日志,以便更详细地了解程序的运行情况,从而找到问题所在。
总的来说,通过设置日志级别,可以大大节省开发者信息筛选的时间,帮助我们快速定位和排除问题。

4.2 日志级别的分类

⽇志的级别分为:

  • trace:微量,少许的意思,级别最低;
  • debug:需要调试时候的关键信息打印;
  • info:普通的打印信息(默认⽇志级别);
  • warn:警告,不影响使⽤,但需要注意的问题;
  • error:错误信息,级别较⾼的错误⽇志信息;
  • fatal:致命的,因为代码异常导致程序退出执⾏的事件。

实际中,我们能自定义的只有前5个,而致命级别的日志,会在代码异常导致程序退出时执行。日志级别的顺序如下图所示:
日志级别
例如,当设置日志级别为 error 时,我们就只能收到 error、fatal 级别的日志了。而之前的案例中,是因为 Spring Boot 中默认的日志级别是 info, 因此,控制台只有 info、warn、error 级别的日志信息。

4.3 日志级别的设置

日志级别的设置,只需要在配置文件中设置 logging.level 配置项即可。

配置根路径的日志级别:

# 日志级别设置
logging:level:root: error

此时,我们再次运行自定义日志打印中的代码,得到如下结果:
运行结果
可见,控制台干净了许多,原来的info等日志信息都被筛选掉了~

在根路径日志级别的基础上配置子目录日志级别

# 日志级别设置
logging:level:root: errorcom:hxh:demo:controller: trace

此时,对于 com.hxh.demo.controller 包下的类,trace 及以上级别的日志信息被打印到控制台上。
运行结果


5 日志持久化

到这里,我们已经了解到如何自定义日志打印以及如何设置日志级别。但是还遗留了一个致命性的问题:日志信息是输出在控制台的,如果重新启动项目,控制台的信息不就消失了吗?有没有什么方法能够将日志信息保存起来,方便以后查看呢?
答案是肯定的,在生产环境中,我们常常把日志信息保存下来。而将日志信息保存下来的过程就叫做日志持久化。想要将⽇志进⾏持久化,只需要在配置⽂件中指定⽇志的存储⽬录或者是指定⽇志保存⽂件名之后,
Spring Boot 就会将控制台的⽇志写到相应的⽬录或⽂件下了。

配置日志文件的保存路径:

# 设置日志文件的目录
logging:file:path: D:\\home\\log

日志信息

配置日志文件的文件名:

logging:file:name: D:\\home\\log\\spring-1024.log

日志信息


6 基于lombok的日志输出

6.1 lombok 简单输出日志案例

通过观察自定义日志打印的案例,我们可以看出,每个需要打印日志的归属类都需要有如下语句:

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

该语句比较固定,写起来不太“优雅”,这里提供一种更加简洁的方式:使用 lombok 来更简单的输出,具体步骤如下:

  1. 添加 lombok 框架支持
  2. 使⽤ @slf4j 注解输出⽇志

添加 lombok 依赖

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version><optional>true</optional>
</dependency>

输出日志
使⽤ @Slf4j 注解,在程序中使⽤ log 对象即可输⼊⽇志,并且只能使⽤ log 对象才能输出,这是 lombok 提供的对象名(原因见后面lombok原理)

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
@ResponseBody
@RequestMapping("/student")
@Slf4j
public class StudentController {// 打印日志@RequestMapping("/hi")public String sayHi() {log.error("这是通过 lombok 打印的日志信息~");return "hi";}
}

实现结果

6.2 浅谈 lombok 原理

Lombok 是一种 Java 库,它提供了一些注解来自动生成 Java 代码。Lombok 的原理是在编译时通过 Java 的注解处理器和 AST(Abstract Syntax Tree,抽象语法树)转换器代替开发人员手动编写常见的 Java 代码(如构造函数、getter 和 setter 方法、equals 和 hashCode 方法等)。也就是说,Lombok 在编译期间生成代码,而不是在运行时生成。 Lombok 的使用可以节省开发者在编写 Java 代码时的时间和精力,并且可以让代码更加简洁易懂。

lombok 作用如下图所示:
lombok原理

之前使用 lombok 简单输出日志的案例中,编译生成的字节码文件反编译后如下图所示:
lombok反编译
@slf4j 注解,实质上就是帮助我们进行了 log 对象的创建,我们只需要使用 log 对象即可~

常见的 lombok 注解如下:

注解说明
@Getter自动生成getter方法
@Setter自动生成setter方法
@ToString自动生成toString方法
@EqualsAndHashCode自动生成equals和hashCode方法
@NoArgsConstructor自动生成无参构造器
@AllArgsConstructor自动生成全参构造器
@RequiredArgsConstructor自动生成必填参数的构造器
@Data自动生成getter、setter、toString、equals和hashCode方法
@Builder自动生成Builder模式的代码
@Log自动生成日志对象
@Slf4j自动生成@Slf4j注解
@Value生成不可变类,即final字段以及对应的getter方法
@UtilityClass生成工具类,包含私有构造器和静态方法

写在最后

本文被 JavaEE编程之路 收录点击订阅专栏 , 持续更新中。
 以上便是本文的全部内容啦!创作不易,如果你有任何问题,欢迎私信,感谢您的支持!

在这里插入图片描述

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

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

相关文章

基于单片机空气质量检测二氧化碳 一氧化碳温湿度PM2.5检测系统的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;对空气空气中有毒有害气体进行监测&#xff1b;使用LCD1602液晶显示&#xff0c;采集到的PM2.5值通过单片机串口传输&#xff1b;通过传感器对室内PM2.5粉尘进行检查&#xff1b;通过按键设置的上限值&#xff1b;当检测到有毒气体…

SpringBoot2+Vue2实战(十八)修改密码

一、修改密码&#xff1a; Header.vue <el-dropdown-item style"font-size: 14px; padding: 5px 0"><router-link to"/password" style"text-decoration: none">修改密码</router-link></el-dropdown-item> router/i…

【网络】socket——预备知识 | 套接字 | UDP网络通信

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 在前面本喵对网络的整体轮廓做了一个大概的介绍&#xff0c;比如分层&#xff0c;协议等等内容&#x…

Unity 之 超级详细的隐私问题解决方案

Unity 之 助力游戏增长 -- 解决隐私问题 一&#xff0c;平台测试隐私问题二&#xff0c;解决方式一2.1 勾选自定义Mainifest2.2 修改自定义Mainifest2.3 隐私协议弹窗逻辑 三&#xff0c;解决方式二3.1 导出安卓工程3.2 创建上层Activity3.3 配置AndroidManifest 四&#xff0…

第一百零六天学习记录:数据结构与算法基础:单链表(王卓教学视频)

线性表的链式表示和实现 结点在存储器中的位置是任意的&#xff0c;即逻辑上相邻的数据元素在物理上不一定相邻 线性表的链式表示又称为非顺序映像或链式映像。 用一组物理位置任意的存储单元来存放线性表的数据元素。 这组存储单元既可以是连续的&#xff0c;也可以是不连续的…

论文笔记--Goat: Fine-tuned LLaMA Outperforms GPT-4 on Arithmetic Tasks

论文笔记--Goat: Fine-tuned LLaMA Outperforms GPT-4 on Arithmetic Tasks 1. 文章简介2. 文章概括3 文章重点技术3.1 LLM的选择3.2 算数任务的可学习性(learnability)3.3 大模型的加减乘除 4. 数值实验结果5. 文章亮点6. 原文传送门7. References 1. 文章简介 标题&#xff…

java中使用HttpRequest发送请求调用自己的接口

(539条消息) java中使用HttpRequest发送请求_java httprequest_thankful_chn的博客-CSDN博客 <dependency><groupId>com.github.kevinsawicki</groupId><artifactId>http-request</artifactId><version>5.6</version></dependenc…

网络的构成要素【图解TCP/IP(笔记七)】

文章目录 网络的构成要素通信媒介与数据链路网卡中继器网桥/2层交换机路由器/3层交换机4&#xff5e;7层交换机网关各种设备及其对应网络分层概览 网络的构成要素 通信媒介与数据链路 计算机之间通过电缆相互连接。电缆可以分为很多种&#xff0c;包括双绞线电缆、光纤电缆、同…

Java InetAddress类

【InetAddress类】 【相关方法】 【使用方法实例】 【代码结果】

创新涌动于先,PingCAP 用户峰会 2023 成功举办

2023 年 7 月 13 日&#xff0c;企业级开源分布式数据库厂商 PingCAP 在京成功举办 PingCAP 用户峰会 2023。本届峰会以“创新涌动于先”为主题&#xff0c;PingCAP 全面解析了 AI 时代 TiDB 的演进方向&#xff0c;宣布 TiDB Serverless 正式商用。会上&#xff0c;PingCAP 携…

​python接口自动化(二十八)--html测试 报告——下(详解) ​

简介 五一小长假已经结束了&#xff0c;想必大家都吃饱喝足玩好了&#xff0c;那就继续学习吧。一天不学习&#xff0c;自己知道&#xff1b;两天不学习&#xff0c;对手知道&#xff1b;三天不学习&#xff0c;大家知道&#xff1b;一周不学习&#xff0c;智商输给猪。好了开个…

静态路由介绍

目录 静态路由配置方法&#xff08;基本配置&#xff09;&#xff1a; 静态路由的拓展配置 负载均衡 1.环回接口——测试 2.手工汇总——子网汇总 3.路由黑洞&#xff08;黑洞路由) 4.缺省路由 5.空接口——NULL 0 6.浮动静态路由 静态路由配置方法&#xff08;基本配置&#x…

DHorse v1.2.1 发布,基于k8s的发布平台

综述 DHorse是一个简单易用、以应用为中心的云原生DevOps系统&#xff0c;具有持续集成、持续部署、微服务治理等功能&#xff0c;无需安装依赖Docker、Maven、Node等环境即可发布Java、Vue、React应用&#xff0c;主要特点&#xff1a;部署简单、操作简洁、功能快速。 优化内…

「深度学习之优化算法」(十三)蝙蝠算法

1. 蝙蝠算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)   蝙蝠算法(Bat Algorithm)是受蝙蝠回声定位的特性启发而提出的新兴算法,提出时间是2010年,虽然距今(2020)有近10年,但与其它的经典算法相比仍算一个新算法。算法也已有一定规模的研究和应用,但仍…

Android 14适配

Google I/O 2023 发布的 Android beta2 &#xff0c;Android 14 将在2023年第三季度发布。Google Play 已经开始强制要求targetSdkVersion 33适配&#xff0c;所以 targetSdkVersion 34适配也是非常有必要的。 前台服务类型&#xff08;Foreground service types are required&…

PyTorch: 池化-线性-激活函数层

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 pytorch教程 也可获取。 文章目录 nn网络层-池化-线性-激活函数层池化层最大池化&#xff1a;nn.MaxPool2d()nn.AvgPool2d()nn.MaxUnpool2d()线性层激…

Java设计模式之结构型-桥接模式(UML类图+案例分析)

目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 1、支付方式 2、支付渠道 五、总结 一、基础概念 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;其主要目的是“将抽象部分与实现部分分离&#xff0c;使它们都可以独立地…

[解决Github 克隆错误] unable to access ‘xxx‘: Recv failure: Connect

1.错误描述&#xff1a; 从GitHub上克隆仓库到本地&#xff0c;出现错误&#xff1a; unable to access https://github.com/xxxx: Recv failure: Connection was reset。 克隆失败。 2.第一次解决此问题&#xff1a;从终端输入&#xff1a; git config --global http.sslVer…

GOPATH、GOROOT(VSCode编写第一个go程序)

1. GOROOT和GOPATH GOROOT 和 GOPATH 都是 Go 语言中的环境变量&#xff0c;用于指定 Go 工具链和工作区的路径。 GOROOT 指定了 Go 工具链的安装路径&#xff0c;它包含了 Go 语言的标准库、编译器等工具。在使用 Go 编译器、运行时等工具时&#xff0c;它们会默认从 GOROOT…

LabVIEW开发图像采集和图像处理程序

LabVIEW开发图像采集和图像处理程序 扫描电子显微镜&#xff08;SEM&#xff09;是一种功能强大的工具&#xff0c;广泛用于高分辨率的生物和半导体样品检测。然而&#xff0c;对于大面积或3D成像&#xff0c;SEM成像是一个耗时的过程。MBSEM旨在通过同时扫描多个像素来减少采…