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

news2024/12/23 10:38:24

文章目录

  • 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: error
    com:
      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.coloradmin.cn/o/722006.html

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

相关文章

如果遇到洪灾导致网络瘫痪,对讲机能起到什么作用?

当我们遇到洪灾这种突发事件时&#xff0c;网络基本就会处于瘫痪状态&#xff0c;人们的安全和生命也将面临着极大的威胁。而在这种时候&#xff0c;一种看似普通的通讯工具&#xff0c;却能够成为拯救生命的关键&#xff0c;它就是——对讲机&#xff01; 网络已经成为我们生…

使用3D Slicer进行图像配准

在3D Slicer官网上&#xff08;https://www.slicer.org/&#xff09;下载最新版本的软件 下载完成后按照指示安装软件&#xff0c;并在安装目录下打开软件 打开后在插件市场搜索并安装需要的配准插件 安装完成后重新打开软件&#xff0c;进行图像配准操作&#xff0c;首先需…

FreeRTOS ~(四)同步互斥与通信 ~ (1/3)同步的缺陷

举例子说明&#xff1a;同步的缺陷 首先创建两个任务&#xff1a;Task1和Task2; 让Task1执行一个比较耗时的计算,计算完成之后,通知Task2; Task1&#xff1a;求和,sum,累加10000000次,然后标志位置1 Task2&#xff1a;检测到标志位置1,打印sum值 为了可以在逻辑分析仪上更准确…

Kibana的对索引库的操作(2)

使用Kibana对文档操作 1.新增文档 新增文档并随机生成id: POST /索引库名/类型名{"key","value"} 新增文档并自定义id:POST /索引库名/类型名/id值 {"key","value"} 2.查看文档 如果查询的文档不存在则返回false 3.修改文档 这里需…

【Telephony】SIM单卡到双卡的变化

1、注册观察者 --> PhoneFactory.makeDefaultPhones() --> TelephonyComponentFactory.makeSubscriptionInfoUpdater() --> new SubscriptionInfoUpdater() --> PhoneConfigurationManager.registerForMultiSimConfigChange(this, EVENT_MULTI_SIM_CONFIG_CHAN…

linux下载安装jdk

1、一般linux系统会自带jdk&#xff0c;执行搜索命令&#xff0c;会查询到不同版本jdk。 2、执行yum install java-1.8.0-openjdk 命令下载对应版本jdk 3、java -version 验证

charles 如何获取电脑端微信小程序接口

安装证书 设置代理端口 即可抓取美团酒店小程序的数据 从charles 可以抓取出header 请求&#xff0c;没有所谓的通过遍历循环能简单的得到数据&#xff0c;请求包含加密信息 随便改下数据就是 所以如果要得到这些数据&#xff0c;还非得通过小程序模拟人滑动获取数据&…

Mysql数据库(五) Mysql命令行客户端:内连接查询、左连接查询、右连接查询、自连接查询、子查询

目录 一、 连接查询 对多个表进行查询 1.0 数据准备 1.1 连接查询 1.2 内连接 INNER JOIN 1.3 左连接 LEFT JOIN 1.4 右连接 RIGHT JOIN 1.5 FULL OUTER JOIN 1.6 自连接查询 1.7 子查询-嵌套在查询中 一、 连接查询 对多个表进行查询 1.0 数据准备 在之前的文章当中…

20-Linux 上搭建 Java Web 环境

目录 1.搭建 JDK 运行环境 ①查看所有的 Java 安装包&#xff1a; ②安装&#xff08;安装 Java 1.8 相关的软件包&#xff09;&#xff1a; PS&#xff1a;卸载使用 ③验证是否安装成功&#xff1a; 2.安装并运行 Tomcat ①去官网下载Tomcat压缩包至本地&#xff0c;再…

4.Nginx缓存设置和CDN

文章目录 Nginx缓存设置设置缓存取消不需要内容的缓存查看nginx缓存数据 CDN概念工作原理 Nginx缓存设置 设置缓存 ##在yum配置文件中添加nginx在线源vim /etc/yum.repos.d/nginx.repo[nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/7/$base…

28-大文件上传(了解)

一、是什么&#xff1f; &#x1f697;&#x1f697;&#x1f697;不管怎样简单的需求&#xff0c;在量级达到一定层次时&#xff0c;都会变得异常复杂。 文件上传简单&#xff0c;文件变大就复杂 上传时&#xff0c;以下几个注意点会影响用户体验 服务器处理数据的能力请求超…

AI PPT 一句话搞定PPT讲演搞

相信大家在职场中&#xff0c;一定会接触过写PPT&#xff0c;经常会把你搞得焦头烂额。在大部分的公司里&#xff0c;写PPT汇报又是不可能逃避的事情。但随着AI时代的到来&#xff0c;有很多AI帮你写PPT的工具也逐渐崭露头角&#xff0c;可以自动帮助你制作出华丽的PPT&#xf…

HOT47-从前序与中序遍历序列构造二叉树

leetcode原题链接&#xff1a;从前序与中序遍历序列构造二叉树 题目描述 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder …

攻防演练中红队常用的攻击方法之横向移动(上)

横向移动&#xff0c;是攻击者侵入企业系统时&#xff0c;获取相关权限及重要数据的常见攻击手法。了解横向移动的原理有助于个人和企业更好地维护网络安全。 中安网星特此推出了横向移动科普系列&#xff0c;本系列共有三篇文章。 近年来&#xff0c;随着网络攻击、勒索事件…

B. Number Factorization - 数论

分析&#xff1a; 可以将n分解成质因数&#xff0c;要求是加和尽可能大&#xff0c;那么可以让所有的指数都是1&#xff0c;a*b>ab一定成立&#xff0c;所以要尽可能地将质因数乘在一起组成更大的数&#xff0c;加在一起得到最后的解。 代码&#xff1a; #include <bit…

Matlab中解常微分方程(组)的命令

常微分方程组求解命令与示例 线性常微分方程&#xff08;组&#xff09; ode45 4 order 龙格库塔法example odefun (t, y) [-2*y(1) y(2); y(1) - 2*y(2)]; tspan [0 10]; y0 [1; 0]; [t, y] ode45(odefun, tspan, y0); ode23 使用二三阶Bogacki-Shampine方法求解非刚性…

Devops系列二(使用helm chart,将java应用发布部署至k8s的示例)

一、接着上一篇的话 docker镜像已经有了&#xff0c;本文我们将接着演示如何使用helm部署应用到k8s。 分为两大部分&#xff1a; 制作helm chart&#xff0c;推送到私有仓库nexushelm拉取chart&#xff0c;部署到k8s 二、制作helm chart 要求你先安装helm&#xff0c;随便一…

Rust 第四天—Rust进阶1

上一篇介绍了Rust的所有权特性,今天就把剩下一些之前没介绍但项目中常用的内容总结一下. 结构体泛型trait 1 结构体 和c语言一样,Rust使用struct关键字来定义一个结构体,结构体可以将不同的类型数据进行整合,加快内存访问速度. 1.1 结构体定义 struct Test{username:Strin…

【第四天学习】决策分支,判断语录

决策分支 If语句 If语句是对基础的一种选择结构语句&#xff0c;它主要有三种形式&#xff0c;分别是if语句&#xff0c;if else语句和if else If else多分支语句。 int nCheck 0; if(nNum4) { nCheck4; } else { nCheck8; }If语句其实就是一个判断语句&#xff0c;它会判断…

详细解释lvs的工作原理

vsl用于集群中的直接路由它的原理如下 如果在公司并发太高了怎么解决 1.加配置cpu 内存 带宽 ssd高效硬盘 2.加服务器 为用户提供服务 横向扩展 集群是什么 由的多台主机构成,相当于一台大型计算机,只提供一个访问入口(域名与ip地址) 集群用在那个场景 高并发场景 vrrp是…