SpringBoot终幕——日志的输出以及Lombok常用注解
⭐️前面的话⭐️
本篇文章将介绍Java中HashMap的底层实现原理,有关HashMap为数组开辟内存的时期,默认的容量,默认负载因子,树化的条件,HashMap的扩容机制,put方法的过程以及HashMap中的哈希函数。
📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
📆首发时间:🌴2022年8月31日🌴
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《数据结构》,📚《算法导论》
💬参考在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
1.日志以及日志的作用
1.1什么是日志
日志就是程序在运行过程当中输出的一些提示或异常信息,我们可以通过日志来观察程序执行的情况,如果程序出现bug,我们可以根据日志去发现和排查程序的bug。
当我们启动SpringBoot项目的时候,会有以下的输出,这些就是日志。
因为 Spring Boot 中内置了日志框架 Slf4j,所以咱们可以直接在程序中调用 slf4j 来输出日志。
常见的日志框架说明,日志框架是使用“门面模式”来实现的,slf4j其实与JDBC很像,我们知道使用JDBC操作数据库,一套JDBC代码可以操作很多种数据库,可以是mysql,也可以是db2,sql server等,而这个JDBC就相当于代理一样,来代理去操作数据库,我们不必关心各种数据库的实现,只需关注JDBC得到使用即可。
而日志框架也是这样,slf4j并不是实现了日志框架,他只是一个门面或者一个代理,去代理我们调用日志实现框架,这样我们不必关心日志实现的细节,这一层面我们感知不到,这就是门面模式所带来的好处,还有一个好处就是如果日志实现层出现了漏洞,我们需要修改日志实现的框架,虽然日志实现的框架发生了改变,但是我们的代码仍然可以正常运行。
1.2日志的作用
日志除了能够帮助排除程序的bug之外,常见还有以下的作用:
- 记录用户登录日志,方便分析用户是正常登录还是恶意破解用户。
- 记录系统的操作日志,方便数据恢复和定位操作人。
- 记录程序的执行时间,方便为以后优化程序提供数据支持。
2.日志的使用
使用日志框架可以配置日志的级别来控制日志的输出,而使用printf
输出日志无法做到这一点。
2.1自定义日志的输出
第一步,在一个类中先获取到日志对象,日志对象是日志框架提供的,日志框架已经默认集成到SpringBoot里面了。
这个日志对象来自slf4j
。
假设我们在类UserController
设置自定义日志的输出,则日志对象创建代码如下:
private final static Logger log =
LoggerFactory.getLogger(UserController.class);
第二步,使用日志对象提供方法来实现自定义日志的打印。
日志对象提供的方法有很多,可以设定不同级别的日志信息输出。
示例代码:
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
就有日志输出了。
为什么我们的代码写了5个日志的输出,结果只有3个日志输出呢?这是因为springboot项目下,默认日志级别为info
,低于info
日志级别的都不会输出,具体级别的高低我们稍后再说。
对于上述输出的日志,具体对应信息如下图:
根据这些信息,我们可以知道日志是发生在什么时间,哪个线程,哪个类,以及具体的日志信息。
2.2日志级别
日志级别:
- trace微量,少许的意思,级别最低
- info普通的打印信息
- debug需要调试时候的关键信息打印
- warn警告,不影响使用,但需要注意的问题
- error错误信息,级别较高的错误日志信息
- fatal∶致命的,因为代码异常导致程序退出执行的事件,不支持用户自定义
当默认日志级别设置为info
,那么比info
日志级别低的是不能输出的,也就是debug
与trace
的日志是不会输出的,这也解释了我们上述输出的问题,因为默认情况下,默认日志级别为info
,因此上面自定义输出的日志没有debug
与trace
的自定义日志信息。
当然默认日志级别是可以设置的,可以通过配置文件进行设置,这样就可以实现在开发环境有一套日志输出方案,在生产环境有一套日志输出方案,下面来介绍如何配置日志级别。
2.3默认日志级别的配置
日志级别包括两类,一类是全局日志级别,另一类就是局部日志级别,全局日志级别可以影响全局日志的输出,而局部日志级别只会影响一个局部的日志输出,并且局部日志级别配置大于全局日志级别的配置。
全局日志级别配置,如修改默认日志级别为trace
:
properties日志格式:
# 设置全局日志级别
logging.level.root=trace
yml日志格式:
logging:
level:
root: trace
运行上面我们的自定义日志代码,会发现,我们所有的自定义日志信息都会输出,并且你还会发现我们程序会有更多的日志信息输出,毕竟我们设置的是全局的配置文件,会影响全局。
下面来介绍局部日志级别的配置,我们将UserController
类的日志级别设置为trace
,这样就不会有频繁的其他日志来淹没我们自定义日志的输出了。
properties格式配置文件:
# 设置文件夹局部的日志级别 局部为主
logging.level.com.example.demo.controller=trace
yml格式配置文件:
logging:
level:
com:
example:
demo:
controller: trace
并且如果全局日志级别与局部日志级别,局部日志级别优先。
2.4日志持久化
所谓日志持久化,就是将日志信息保存到磁盘,同样,我们只需要设置配置文件即可。
方式1:设置日志保存路径
使用/
分割路径
# 设置日志保存路径
logging.file.path=D:/Doc/
使用\
分割路径,需要转义
logging.file.path=D:\\Doc\\
这样就会储存好了,在对应目录下找即可。
方式2:设置日志保存名称
# 设置日志保存名称
logging.file.name=D:/Doc/logging.log
使用\
分割路径我就不写了。
效果如下:
2.5使用Lombok中的注解实现日志打印
在Lombok中有一个@Slf4j注解,我们使用该注解就能实现日志的打印。
准备工作,添加Lombok依赖。如果没有添加该依赖,使用Edit Starters插件添加即可。
这样依赖就添加好了。
使用方法:在想打印日志的类上加上@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");
}
}
更简单地完成了日志输出的工作。
其实该注解只是替代了日志对象创建的代码:
private final static Logger log = LoggerFactory.getLogger(UserController.class);
所以我们需要使用log
变量调用出相关输出日志的方法。
2.6Lombok框架实现原理以及其他常见注解
Lombok框架其实在编译的时候,将依据注解去替换对应的代码,比如就像上面的日志对象创建,加上一个@Slf4j注解后,在编译时就会将类似与上面创建日志对象的代码生成到我们所写代码里面去,包括Lombok其他的注解,如生成Setter的注解@Setter,生成Getter的注解@Getter等都是通过编译时期间实现的。
Lombok作用:
其他常用注解:
基本注解:
组合注解:
日志注解:
下期预告:SpringMVC
- 点赞
- 收藏
- 关注作者
评论(0)