网络知识 娱乐 SpringBoot终幕——日志的输出以及Lombok常用注解

SpringBoot终幕——日志的输出以及Lombok常用注解

⭐️前面的话⭐️

本篇文章将介绍SpringBoot日志文件,日志的作用,自定义日志,日志级别,Lombok框架的常用注解。

小贴士:博主推荐->学习面试刷题必用工具

📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
📆首发时间:🌴2022年8月16日🌴
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《SpringBoot实战》
💬推荐在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!


📌导航小助手📌

  • 1.日志以及日志的作用
    • 1.1什么是日志
    • 1.2日志的作用
  • 2.日志的使用
    • 2.1自定义日志的输出
    • 2.2日志级别
    • 2.3默认日志级别的配置
    • 2.4日志持久化
    • 2.5使用Lombok中的注解实现日志打印
    • 2.6Lombok框架实现原理以及其他常见注解


注意事项:博主安利一款刷题面试的神器,如果有小伙伴还没有注册牛客,可以点击下方链接进行注册,注册完就能立即刷题了。不仅是刷题,上面还有很多有关就业的面经,面试题库,以及名企的模拟面试,我非常推荐它,博主自己用的也很多,也刷了不少题了!下图可以作证:
1

注册地址:牛客网

1

有关任何问题都可以与博主交流,你可以在评论区留言,也可以私信我,更可以加上博主的vx与博主一对一交流(文章最下方有)。

封面区


1.日志以及日志的作用

1.1什么是日志

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

当我们启动SpringBoot项目的时候,会有以下的输出,这些就是日志。
1
因为 Spring Boot 中内置了日志框架 Slf4j,所以咱们可以直接在程序中调用 slf4j 来输出日志。

常见的日志框架说明,日志框架是使用“门面模式”来实现的,slf4j其实与JDBC很像,我们知道使用JDBC操作数据库,一套JDBC代码可以操作很多种数据库,可以是mysql,也可以是db2,sql server等,而这个JDBC就相当于代理一样,来代理去操作数据库,我们不必关心各种数据库的实现,只需关注JDBC得到使用即可。

而日志框架也是这样,slf4j并不是实现了日志框架,他只是一个门面或者一个代理,去代理我们调用日志实现框架,这样我们不必关心日志实现的细节,这一层面我们感知不到,这就是门面模式所带来的好处,还有一个好处就是如果日志实现层出现了漏洞,我们需要修改日志实现的框架,虽然日志实现的框架发生了改变,但是我们的代码仍然可以正常运行。

2

1.2日志的作用

日志除了能够帮助排除程序的bug之外,常见还有以下的作用:

  • 记录用户登录日志,方便分析用户是正常登录还是恶意破解用户。
  • 记录系统的操作日志,方便数据恢复和定位操作人。
  • 记录程序的执行时间,方便为以后优化程序提供数据支持。

2.日志的使用

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

2.1自定义日志的输出

第一步,在一个类中先获取到日志对象,日志对象是日志框架提供的,日志框架已经默认集成到SpringBoot里面了。

这个日志对象来自slf4j
1

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

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

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

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@ResponseBody
public class UserController {
    private  final static Logger log = LoggerFactory.getLogger(UserController.class);
    @RequestMapping("/logger")
    public void sayHi() {
        log.trace("我是trace");
        log.info(("我是info"));
        log.debug("我是debug");
        log.error("我是error");
        log.warn("我是warn");
    }
}

我们启动程序后,访问http://127.0.0.1:8080/logger就有日志输出了。

3

为什么我们的代码写了5个日志的输出,结果只有3个日志输出呢?这是因为springboot项目下,默认日志级别为info,低于info日志级别的都不会输出,具体级别的高低我们稍后再说。

对于上述输出的日志,具体对应信息如下图:
4
根据这些信息,我们可以知道日志是发生在什么时间,哪个线程,哪个类,以及具体的日志信息。

2.2日志级别

日志级别:

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

日志级别顺序

当默认日志级别设置为info,那么比info日志级别低的是不能输出的,也就是debugtrace的日志是不会输出的,这也解释了我们上述输出的问题,因为默认情况下,默认日志级别为info,因此上面自定义输出的日志没有debugtrace的自定义日志信息。

当然默认日志级别是可以设置的,可以通过配置文件进行设置,这样就可以实现在开发环境有一套日志输出方案,在生产环境有一套日志输出方案,下面来介绍如何配置日志级别。

2.3默认日志级别的配置

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

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

properties日志格式:

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

yml日志格式:

logging:
	level:
		root: trace

运行上面我们的自定义日志代码,会发现,我们所有的自定义日志信息都会输出,并且你还会发现我们程序会有更多的日志信息输出,毕竟我们设置的是全局的配置文件,会影响全局。

2
下面来介绍局部日志级别的配置,我们将UserController类的日志级别设置为trace,这样就不会有频繁的其他日志来淹没我们自定义日志的输出了。

properties格式配置文件:

# 设置文件夹局部的日志级别 局部为主
logging.level.com.example.demo.controller=trace

yml格式配置文件:

logging:
	level:
		com:
			example:
				demo:
					controller: trace

并且如果全局日志级别与局部日志级别,局部日志级别优先。

5

2.4日志持久化

所谓日志持久化,就是将日志信息保存到磁盘,同样,我们只需要设置配置文件即可。

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

使用/分割路径

# 设置日志保存路径
logging.file.path=D:/Doc/

使用分割路径,需要转义

logging.file.path=D:\Doc\

这样就会储存好了,在对应目录下找即可。

6
7

方式2:设置日志保存名称

# 设置日志保存名称
logging.file.name=D:/Doc/logging.log

使用分割路径我就不写了。

效果如下:
8
9

2.5使用Lombok中的注解实现日志打印

在Lombok中有一个@Slf4j注解,我们使用该注解就能实现日志的打印。

准备工作,添加Lombok依赖。如果没有添加该依赖,使用Edit Starters插件添加即可。
10
这样依赖就添加好了。
11

使用方法:在想打印日志的类上加上@Slf4j注解就好。

@Controller
@ResponseBody
@Slf4j
public class UserController {
//    private  final static Logger log = LoggerFactory.getLogger(UserController.class);
    @RequestMapping("/logger")
    public void sayHi() {
        log.trace("我是trace");
        log.info(("我是info"));
        log.debug("我是debug");
        log.error("我是error");
        log.warn("我是warn");
    }
}

更简单地完成了日志输出的工作。
12
其实该注解只是替代了日志对象创建的代码:

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

所以我们需要使用log变量调用出相关输出日志的方法。

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

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

16
Lombok作用:
17
其他常用注解:
基本注解:
18
组合注解:
19
日志注解:
20


下期预告:SpringMVC

到文章最后,再来安利一下吧,博主也是经常使用,并且也经常在牛客上刷题,题库也非常丰富:学习,刷题,面试,内推都有。也欢迎与博主交流有关刷题,技术方面,以及与博主聊聊天,交个朋友也好啊,毕竟有朋自远方来!

觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!

1-99