SpringBoot日志详解

时间:2022-12-11 15:57:06

SpringBoot日志详解
⭐️前言⭐️

????博客主页: ????【如风暖阳】????
????精品Java专栏【JavaEE进阶】、【JavaEE初阶】【MySQL】【数据结构】
????欢迎点赞 ???? 收藏留言评论 ????私信必回哟????

????本文由 【如风暖阳】 原创,首发于 CSDN????

????博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言

????博客中涉及源码及博主日常练习代码均已上传GitHub


SpringBoot日志详解

????1.日志及日志的作用

日志是程序的重要组成部分,如果程序报错了,我们可以打开控制台看日志,来找到报错的原因。

除了发现和定位问题之外,我们还可以通过日志实现以下功能。

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

SpringBoot日志详解

如图所示,就是SpringBoot的日志打印。

????2.自定义日志打印

完成自定义日志的打印需要以下两步:
1、在一个类中先获取到打印日志对象(日志框架提供日志对象,日志框架默认已经集成到SpringBoot中了)
2、使用日志对象提供的方法实现日志的打印

下边具体阐述:

2.1 得到日志对象

在程序中获取日志对象需要使用日志工厂LoggerFactory,如下代码所示:

@Controller
public class UserController {
    private static final Logger log= 
            LoggerFactory.getLogger(UserController.class);
}

日志工厂需要将每个类的类型传递进去,这样我们才知道日志的归属类,才能更方便、直观的定位到问题类。

注意:Logger对象是属于org.slf4j包下的,不要导错包
SpringBoot日志详解
因为SpringBoot中内置了日志框架Slf4j,所以咱们可以直接在程序中调用slf4j来输出日志。

2.2 使用日志对象打印日志

日志对象的打印方法有很多种,如下代码所示:

@Controller
@ResponseBody
public class UserController {
    //1.先得到日志对象(来自slf4j)
    private static final Logger log=
            LoggerFactory.getLogger(UserController.class);
    @RequestMapping("/sayhi")
    public void sayHi() {
        //2.使用日志对象提供的打印方法进行日志打印
        log.trace("我是trace");
        log.debug("我是debug");
        log.info("我是info");
        log.warn("我是warn");
        log.error("我是error");
    }
}

运行结果如下图:
SpringBoot日志详解
我们可以发现,我们调用了五个方法来进行打印的,但是控制台中只显示了三条我们的打印信息,这是因为有日志级别的约束,默认的日志级别是info级别,只能打印infoinfo以上的日志信息,日志级别的具体详情见下:

????3.日志级别

3.1 日志级别有什么用?

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

3.2 日志级别的分类

日志的级别如下:
1.trace:少许日志(级别最低)
2.debug:调试日志
3.info:普通信息日志(默认日志级别)
4.warn:警告日志
5.error:错误日志
6.fatal:致命的日志(系统输出的日志,不能自定义打印)
SpringBoot日志详解

3.3 日志级别的设置

日志级别配置只需要在配置文件中设置logging.level配置项即可,如下所示:
SpringBoot日志详解
再次打印日志信息看结果:
SpringBoot日志详解
可以发现这次的日志打印信息少了很多,这是因为全局的日志级别是warn,比warn级别低的日志信息不会被打印,而在controller包下设置的日志级别是trace,所以它的五条日志信息都进行了打印。

根据上边的日志打印结果我们可以得出结论:
当存在局部日志级别和全局日志级别时,当访问局部日志时,使用的是局部日志级别,也就是局部日志级别>全局日志级别

????4.日志持久化

以上的日志都是打印在控制台上的,然而在生产环境上咱们需要将日志保存下来,以便出现问题之后追溯问题,把日志保存下来的过程就叫做持久化

想要将日志进行持久化,只需要在配置文件中指定日志的存储目录或者是指定日志保存文件名,SpringBoot就会将控制台的日志写到相应的目录或文件下了。
SpringBoot日志详解
注意\会引起转义,所以可以使用\\或者/来防止转义。
再次运行,可以看到日志信息已经被写到指定的文件中了。
SpringBoot日志详解

????5.通过Lombok实现更简单的日志输出

我们每次都使用LoggerFactory.getLogger(xxx.class)很繁琐,且每个类都添加一遍,也很麻烦,下边我们展示使用lombok来实现更简单的日志输出。
1.添加lombok框架支持
2.使用@slf4j注解输出日志

5.1 添加lombok依赖

我们可以先下载以下插件:
SpringBoot日志详解
然后在pom.xml文件中右键->generate->插件,将lombok依赖引入pom.xml配置文件中
SpringBoot日志详解

5.2 输出日志

1、使用@Slf4j得到日志对象log
2、使用log对象自定义打印日志
SpringBoot日志详解

5.3 lombok更多注解说明

基本注解:
SpringBoot日志详解
组合注解:
SpringBoot日志详解
日志注解:
SpringBoot日志详解

????6.总结

日志是程序中的重要组成部分,使用日志可以快速的发现和定位问题,Spring Boot内置了日志框架,默认情况下使用的是info日志级别将日志输出到控制台的,我们可以通过lombok提供的@Slf4j注解和log对象快速的打印自定义日志,日志包含6个级别:
SpringBoot日志详解
日志级别依次提升,而日志级别越高,收到的日志信息也就越少,我们可以通过配置日志的保存名称或保存目录来将日志永久地保存下来。


⭐️最后的话⭐️
总结不易,希望uu们不要吝啬你们的????哟(^U^)ノ~YO!!如有问题,欢迎评论区批评指正????

SpringBoot日志详解