SpringBoot的日志信息及Lombok的常用注解

news2024/11/23 22:46:38

文章目录

  • 一. 日志的介绍
    • 1. 什么是日志
    • 2. 日志的作用
  • 二. 日志的使用
    • 1. 日志格式说明
    • 2. 自定义日志的输出
    • 3. 日志级别
    • 4. 日志级别的配置
    • 5. 日志持久化
    • 6. 更简单的输出日志-Lomok
    • 7. Lombok框架实现原理以及其他常见注解

一. 日志的介绍

1. 什么是日志

日志是我们程序重要组成部分,它是程序在运行过程当中输出的一些提示或异常信息,我们可以通过日志来观察程序执行的情况,如果程序出现 Bug,我们可以根据日志去发现和排查程序的 Bug。

SpringBoot 项目在启动的时候,就会有默认的日志输出,如下图所示:
img
之所以会有上面的输出,是因为 SpringBoot 中内置了日志框架。

SpringBoot 中内置了 SLF4J 和 logback 两个日志框架,用户层面并不是直接操作具体的日志对象,而是使用 SLF4J 提供给用户的 API 进而由 logback 操作具体的日志对象实现日志。
imgimg

SLF4J 这类框架是使用“门面模式”来实现的,SLF4J 其实和 JDBC 很像,我们知道使用 JDBC 操作数据库,一套 JDBC 代码就可以操作很多种数据库,可以是 MySQL,Oracle,DB2,SqlServer等,而这个JDBC 就相当于代理一样,来代理去操作数据库,我们不必关心各种数据库的实现,只需关注 JDBC 提供给我们的的 API 即可。

类似的,SLF4J 中也并不是真正完成了日志实现的框架,它只是一个门面或者一个代理,我们调用 SLF4J 的 API,SLF4J 中还会去调用 logback 这样的日志实现框架,此时我们就不必关心日志实现的细节,这一层面我们是感知不到的,这就是门面模式所带来的好处,还有一个好处就是如果日志实现层出现了漏洞,只需要修改更换日志实现的框架即可,而 SLF4J 可以匹配相应的日志框架,此时虽然日志实现的框架发生了改变,但我们写的代码仍然不受影响,这样就使得系统的依赖性降低,利于系统更新和维护。

img

2. 日志的作用

  1. 能够帮助程序猿排除程序的 Bug。
  2. 记录用户登录日志,方便分析用户是正常登录还是恶意破解用户。
  3. 记录系统的操作日志,方便数据恢复和定位操作人。
  4. 记录程序的执行时间,方便为以后优化程序提供数据支持。

二. 日志的使用

使用日志框架可以配置日志的级别来控制日志的输出,而我们日常使用System.out.printf来输出日志是无法做到这一点的。

1. 日志格式说明

对于控制台输出的日志,它的各部分含义如下:
img
信息中的包名有部分是简写,取的是包名的第一个字母;
根据这些信息,我们就可以知道日志是发生在什么时间,在哪个线程,哪个类,以及具体的日志信息。

2. 自定义日志的输出

1️⃣第一步,在类中先获取到日志对象,这个日志对象来自于日志框架SLF4J

假设我们在类LogController设置自定义日志的输出,则日志对象创建代码如下:

每一个类都对应一个日志对象,可以通过日志工厂LoggerFactory获取的,导包的时候要注意Logger对象是在org.slf4j包下的,不要导错。

// 获取日志对象
private static Logger log =
        LoggerFactory.getLogger(LogController.class);

getLogger()一般传入传入当前类的类型,这里的参数用来定位日志的归属类,以方便日志输出,输出的日志信息中有了日志的定位, 才能更方便、更直观的定位到问题类。

2️⃣第二步,使用日志对象提供的方法来实现自定义日志的打印。

日志对象提供的方法有很多,可以设定不同级别的日志信息输出。
img
🍂示例代码:

@RestController相当于是将@Controller@ResponseBody这两个注解合起来的效果。

package com.example.springboot2.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LogController {
    // 获取日志对象
    private static Logger log =
            LoggerFactory.getLogger(LogController.class);
    
    @RequestMapping("/log")
    public void log() {
        log.trace("我是trace");
        log.debug("我是debug");
        log.info(("我是info"));
        log.warn("我是warn");
        log.error("我是error");
    }
}

我们启动程序后,访问http://127.0.0.1:8080/log后,控制台就有相应的日志输出了。

img

观察输出结果,我们的代码是写了 5 个级别的日志输出的,为什么这里结果只有 3 个结果呢?这是因为SpringBoot 项目下,默认日志级别为info,低于info日志级别的都不会输出。

3. 日志级别

🍂日志级别分为一下几种:

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

img

SpringBoot 项目默认的日志级别是info,那么比info日志级别低的是不能输出的,也就是debugtrace的日志是不会输出的,只有大于等于info级别的日志才会输出。

🍂日志级别的作用:

  1. 日志级别可以帮我们筛选出重要的信息,比如设置日志级别为 error,那么就可以只看程序的报错日志了,对于普通的调试日志和业务日志就可以忽略了,从而节省开发者信息筛选的时间。
  2. 日志级别可以控制不同环境下,⼀个程序是否需要打印日志,如开发环境我们就需要很详细的日志信息, 而生产环境为了保证性能和安全性就会输⼊尽量少的⽇志,通过日志的级别就可以实现此需求。

简单来说,就是过滤信息,将业务不需要的日志屏蔽掉。

4. 日志级别的配置

日志级别是可以通过配置文件进行设置的,日志级别包括两类,一类是全局日志级别,另一类就是局部日志级别,全局日志级别可以影响全局日志的输出,而局部日志级别只会影响一个局部的日志输出,并且局部日志级别配置大于全局日志级别的配置。

🎯全局日志级别配置,如修改默认日志级别为trace

properties 日志格式:

# 设置全局日志级别
logging.level.root=trace

yml 日志格式:

logging:
	level:
		root: trace

运行上面我们的自定义日志代码,此时就会发现,我们所有的自定义日志信息都会输出,并且随着程序启动相比较默认情况下会有更多的日志信息输出,毕竟这里设置的是全局的配置文件,会影响全局。

img
🎯下面来介绍局部日志级别的配置,我们将LogController类的日志级别设置为warn,此时只会LogController类中日志输出级别,并不会影响其他位置的日志信息输出。

properties 格式配置文件:

# 设置夹局部的日志级别 (包名/包名+类名)
logging.level.com.example.demo.controller.LogController=warn

yml 格式配置文件:

logging:
	level:
		com:
			example:
				demo:
					controller: 
                    	LogController :warn

控制台结果:

img

yml 格式配置文件可以一步设置全局和局部的日志级别,比如:

logging:
  level:
    root: info
    com:
      example:
        springboot2:
          controller: error
          service: warn

root设置的是全局日志级别,项目中所有日志级别都是info;和root同级下可设置局部具体类的日志级别m这里就是com.example.springboot2.controllercom.example.springboot2.service包下的类,级别分别为errorwarn

5. 日志持久化

前面的介绍都是将日志输出在控制台上的,然而我们在生产环境下往往需要将日志保存下来,以便于后续出现问题时去追溯原因,将日志保存下来的过程就称之为持久化。

实现日志持久化的方式就是将日志信息保存到磁盘,同样可以通过设置配置文件实现。

🎯方式1:设置日志保存路径

properties 格式配置文件:

logging.file.path=D:\\bit\\logs

yml 格式配置文件:

logging:
  file:
    path: D:\\bit\\logs

启动程序,此时 SpringBoot 就会将控制台中打印的日志写到对应的目录了,日志文件默认名的为spring.log

img
img

🎯方式2:设置日志保存文件

properties 格式配置文件:

logging.file.name=D:\\bit\\log\\logging.log

yml 格式配置文件:

logging:
  file:
    name: D:\\bit\\log\\logging.log

效果如下:
img
img

还要注意,多次访问程序产生的日志是以追加的形式保存到日志文件当中的,SpringBoot 默认保存日志文件的大小为10MB**,**超出范围就会自动创建新的日志文件,然后保存到新的日志文件当中。

当然,也可以通过配置文件自定义日志文件的大小,配置方式如下:

# properties格式
logging.logback.rollingpolicy.max-file-size=10MB

# yml格式
logging:
	logback:
    	rollingpolicy:
    		max-file-size: 10MB

6. 更简单的输出日志-Lomok

每次都使⽤ LoggerFactory.getLogger(xxx.class) 很繁琐,且每个类都添加⼀遍,也很麻烦,在 Lombok 中有一个@Slf4j注解,可以使用该注解更简单的输出日志。

准备工作,首先要确保你的 IDEA 中有 Lombok 这个插件,没有的话去下载一下。

img

然后,添加 Lombok 依赖,可以使用 Edit Starters 插件快捷添加。
img

刷新一下,依赖就添加好了。
img

🍂使用方法:在想打印日志的类上加上 @Slf4j 注解即可,它会为当前类提供一个 log 对象。

要注意使用 @Slf4j 注解,在程序中使用 log 对象即可输⼊⽇志,并且只能使⽤ log 对象才能输出,这是 lombok 提供的对象名;代码中输入 log 后就会有相关方法的提醒(前提是安装了 lombok 插件)。

package com.example.springboot2.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j  // 当前的类中就可以直接使用 log 对象, @Slf4j 产生一个 log 对象, 直接使用即可
public class LogController2 {
    @RequestMapping("/log2")
    public void log2(){
        log.trace("我是trace");
        log.debug("我是debug");
        log.info(("我是info"));
        log.warn("我是warn");
        log.error("我是error");
    }

}

启动程序,访问路路径http://127.0.0.1:8080/log2,同样可以输出日志,代码更简单。
img
@Slf4j 注解替代了日志对象获取的代码:

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

7. Lombok框架实现原理以及其他常见注解

Lombok 框架其实在编译的时候,将依据注解去替生成对应的代码,比如就像上面的日志对象创建,加上一个 @Slf4j 注解后,在编译时就会将类似与上面创建日志对象的代码生成到我们所写代码里面去,包括Lombok 其他的注解,如生成 Setter 的注解 @Setter,生成 Getter 的注解 @Getter 等都是通过编译时期间实现的。

img
🍂Lombok作用:
img

比如上面我们写的代码最终生成相应的字节码文件就在 target 目录中,target 目录中的代码才是项目最终执行的代码,查看 target 目录如下:

img

我们来对比一下我们LogController2.java原文件代码和程序运行起来后生成LogController2.class文件中的代码(由 IDEA 反编译显示)。

img

发现代码中的 @Slf4j 注解就不存存在了,被 log 对象替代了,所以,Lombok 是不会影响程序运行的信能的,它要完成的工作都是在编译生成字节码文件前完成的。
🍂其他常用注解:
基本注解:

注解作用
@Setter⾃动添加 setter 方法
@Getter⾃动添加 getter 方法
@ToString⾃动添加 toString 方法
@EqualsAndHashCode⾃动添加 equals 和 hashCode 方法
@NoArgsConstructor⾃动添加⽆参构造方法
@AllArgsConstructor⾃动添加全属性构造⽅法,顺序按照属性的定义顺序
@NonNull属性不能为 null
@RequireArgsConstructor⾃动添加必需属性的构造方法,final + @NonNull 的 属性为必需

组合注解:

注解作用
@Data@Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor + @NoArgsConstructor

日志注解:

注解作用
@Slf4j添加⼀个名为 log 的日志,使用 slf4j

使用 Lombok 提供给我们的这些注释,可以很好的帮助我们消除项目中大量冗余的代码,可以使得我们的 Java 类可以看起来非常的干净整洁。

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

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

相关文章

UE4/5数字人MetaHuman的控制绑定资产使用

开始操作 首先我们创建一个关卡序列: 打开后将我们的数字人放进去【右键,第一个添加进去】: 我们会自动进入动画模式,没有的话,就自己进入一下, 然后我们去寻找我们的控制绑定资产。 找到控制绑定资产 …

pdf文件如何编辑修改?学会这几种简单编辑方法

pdf文件如何编辑修改?在日常工作和学习中,我们经常需要编辑和修改PDF文件。无论是工作中的合同、报告或学习中的笔记、课件,PDF文件都是我们常用的文档格式。然而,PDF文件的特性使得它们很难被直接编辑。那么,如何编辑…

移远通信推出一站式Matter解决方案,构建智能家居开放新生态

近日,全球领先的S物联网整体解决方案供应商移远通信宣布,正式推出全新Matter解决方案,从模组、APP、平台、认证、生产五大层面为客户提供一站式服务,赋能智能家居行业加快融合发展。 过去十年,得益于物联网生态的发展&…

Hlang--用Python写个解析器

文章目录 前言语法树节点语法描述异常处理InvalidSyntaxError错误内容定位解析实现bin_op函数factory函数模拟流程总结前言 先前,我们实现了一个基本的词法分析器。那么现在的话,我们要在这个基础上面,实现一个解析器,那么实现效果的话,是这样的: 注意此时此刻,我们还…

一文教你快速 Cloudreve搭建云盘系统,实现随时访问

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了,各互联网大厂也纷纷加入战局&#…

FLatten Transformer

FLatten Transformer: Vision Transformer using Focused Linear Attention ICCV 2023 聚焦式线性注意力模块 关于Transformer 在Transformer模型应用于视觉领域的过程中,降低自注意力的计算复杂度是一个重要的研究方向。线性注意力通过两个独立的映射函数来近似S…

springBoot 配置文件 spring.resources.add-mappings 参数的作用

在Spring Boot应用中,spring.resources.add-mappings参数用于控制是否将特定路径的资源文件添加到URL路径映射中。 默认情况下,该参数的值为true,即会自动将静态资源(例如CSS、JavaScript、图片等)的URL路径添加到Spr…

Mybatis Plus中使用LambdaQueryWrapper进行分页以及模糊查询对比传统XML方式进行分页

传统的XML分页以及模糊查询操作 传统的XML方式只能使用limit以及offset进行分页&#xff0c;通过判断name和bindState是否为空&#xff0c;不为空则拼接条件。 List<SanitationCompanyStaff> getSanitationStaffInfo(Param("name") String name,Param("bi…

〔013〕Stable Diffusion 之 图片自动评分和不健康内容过滤器 篇

✨ 目录 &#x1f388; 下载咖啡美学评价插件&#x1f388; 咖啡美学评价使用&#x1f388; 不健康内容过滤器插件 &#x1f388; 下载咖啡美学评价插件 想让系统帮你的图片作品打分评价&#xff0c;可以下载咖啡美学自动评价插件插件地址&#xff1a;https://github.com/p1at…

记录--webpack和vite原理

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 每次用vite创建项目秒建好&#xff0c;前几天用vue-cli创建了一个项目&#xff0c;足足等了我一分钟&#xff0c;那为什么用 vite 比 webpack 要快呢&#xff0c;这篇文章带你梳理清楚它们的原理…

Python“牵手”1688商品评论数据采集方法,1688API申请指南

1688平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范&#xff0c;1688API接口是指通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问1688平台的数据&#xff0c;包括商品信息、店铺信息、物流信息等&#xff0c;从而实现1688平台…

【校招VIP】java语言类和对象之map、set集合

考点介绍&#xff1a; map、set集合相关内容是校招面试的高频考点之一。 map和set是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索效率与其具体的实例化子类有关系。 『java语言类和对象之map、set集合』相关题目及解析内容可点击文章末尾链接查看&#xff01; …

dm达梦数据库 创建 YEARWEEK 外部函数

这里写目录标题 数据库环境创建方式一、C 外部函数二、JAVA 外部函数 数据库环境 类型版本官网下载地址基础环境Windows 11–Dm8dm8_20230418_x86_win_64.zip链接: 官网 创建方式 一、C 外部函数 &#xff08;1&#xff09;C 外部函数是使用 C、C 语言编写&#xff0c;在数据…

PostgreSQL-UDF用户自定义函数-扩展插件

目录 PostgreSQL-UDF用户自定义函数-扩展插件零、前置条件一、创建 .c 和 .sql 文件创建.c文件创建.sql文件 二、创建 .control 和 Makefile 文件创建 .control 文件创建 Makefile 文件 三、编译 & 链接四、psql&#xff08;或者其他PG backend&#xff09;中创建扩展 Post…

illustrator-形状模式-路径查找器-路径偏移-扩展

文章目录 1.形状模式1.1.联集&#xff1a;形状相加1.2.减去顶层&#xff1a;形状减去共同部分1.3.交集&#xff1a;相同部分1.4.差集&#xff1a;形状不同部分 2.路径查找器2.1.分割2.2.修边2.3.合并2.4.裁剪2.5.轮廓2.6.减去后方对象 3.路径偏移4.扩展外观 打开路径查找器快捷…

吃雪糕也能涨知识了!猿辅导携手中街1946推出“冷知识冰棍”

为了给孩子们的暑假学习加点“料”&#xff0c;猿辅导近日脑洞大开&#xff0c;和中街1946携手推出了“冷知识冰棍”&#xff0c;以数学、英语、语文、科学4个科目为外包装&#xff0c;分别对应草莓山楂、青提菠萝、茉莉蓝莓和蜜桃乌龙等4种口味&#xff0c;为孩子们开启了夏日…

在 SwiftUI 中创建一个环形 Slider

文章目录 前言初始化环形轮廓将进度值和拇指位置绑定添加触摸手势为不同的坐标值设置滑块位置总结 前言 Slider 控件是一种允许用户从一系列值中选择一个值的 UI 控件。在 SwiftUI 中&#xff0c;它通常呈现为直线上的拇指选择器。有时将这种类型的选择器呈现为一个圆圈&#…

centos7、ky10_server(arm版、x86版)将程序做成系统服务

前提条件 提供启动脚本、停止脚本 启动脚本 生成app启动脚本 touch app_start.sh cat > app_start.sh << EOF chmod -R 777 /home/zenglg/appcd /home/zenglg/app/apache-tomcat/bin./startup.sh EOF 停止脚本 生成app.停止脚本 touch app_stop.sh cat > app_sto…

ssm学校运动会信息管理系统源码和论文

ssm学校运动会信息管理系统027 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 在当今社会上&#xff0c;体育运动越来越普及&#xff0c;参与运动会的人越来越多&#xff0c;但是目前对运动会信息管理还…

常见的Web安全漏洞有哪些,Web安全漏洞常用测试方法介绍

Web安全漏洞是指在Web应用程序中存在的可能被攻击者利用的漏洞&#xff0c;正确认识和了解这些漏洞对于Web应用程序的开发和测试至关重要。 一、常见的Web安全漏洞类型&#xff1a; 1、跨站脚本攻击(Cross-Site Scripting&#xff0c;XSS)&#xff1a;攻击者通过向Web页面注入…