SpringBoot 日志文件:日志的作用?为什么要写日志?
作者:mmseoamin日期:2023-12-18

文章目录

  • 🎇前言
  • 1.日志长什么样子?
  • 2.自定义打印日志
    • 2.1 在程序中得到日志对象
    • 2.2 使用日志对象打印日志
    • 3.日志级别
      • 3.1 日志级别的分类与使用
      • 3.2 日志级别有什么用呢?
      • 3.3 日志级别的设置
      • 4.日志持久化保存
      • 5.更方便的日志输出
        • 5.1 添加 lombok 框架
        • 5.2 使用注释输出日志
        • 🎆总结

          SpringBoot 日志文件:日志的作用?为什么要写日志?,在这里插入图片描述,第1张

          🎇前言

          日志、日志,日志就是记录发生了什么。为啥要记录发生了什么呢?想象⼀下,如果程序报错了,不让你打开控制台看⽇志,那么你能找到报错的原因吗?因此我们需要记录程序的行为,通过这些行为能让我们更好的发现和定位错误所在位置。

          除了发现和定位问题之外,还可以通过⽇志实现以下功能:

          • 记录⽤户登录⽇志,⽅便分析⽤户是正常登录还是恶意破解⽤户。
          • 记录系统的操作⽇志,⽅便数据恢复和定位操作⼈。
          • 记录程序的执⾏时间,⽅便为以后优化程序提供数据⽀持。

            可以看出来日志在程序中扮演这非常重要的角色了。

            1.日志长什么样子?

            SpringBoot 项目启动的时候默认就会有日志输出,如下图:

            SpringBoot 日志文件:日志的作用?为什么要写日志?,在这里插入图片描述,第2张

            通过上述日志信息提出三个疑问:

            1. Spring Boot 如何打印日志?(提前把这个说了:它内置了日志框架,因此可以打印日志)
            2. 默认情况下,输出的日志并非是开发者定义和打印的,开发者怎么在程序中⾃定义打印⽇志呢?
            3. 日志默认打印在控制台上,而控制台的日志不能保存,如何将日志永久保存呢?

            接下来让我们寻找找答案

            2.自定义打印日志

            自定义打印日志分为两步走:

            • 在程序中得到日志对象
            • 使用日志对象的相关语法输出打印内容

              2.1 在程序中得到日志对象

              //1.得到日志对象
              private final static Logger logger = LoggerFactory.getLogger(TestController.class);
              

              在导包时,我们使用的时slf4j包下面的 Logger,这里不要导包导错了。

              SpringBoot 日志文件:日志的作用?为什么要写日志?,在这里插入图片描述,第3张

              因为 SpringBoot 中内置了日志框架slf4j,所以我们可以直接在程序中调用slf4来输出日志。

              2.2 使用日志对象打印日志

              // 2.使⽤⽇志打印⽇志
              logger.info("--------------要输出⽇志的内容----------------");
              

              日志打印结果:

              SpringBoot 日志文件:日志的作用?为什么要写日志?,在这里插入图片描述,第4张

              这日志打印出来看起来像是一串字符串,我们如何去看出来日志打印的是什么东西呢?看下图的介绍:

              SpringBoot 日志文件:日志的作用?为什么要写日志?,在这里插入图片描述,第5张

              日志之间有很多等级划分,我们通常把他分为六个等级。

              3.日志级别

              3.1 日志级别的分类与使用

              日志级别一览表(由上到下等级递增):

              等级解释
              trace微量,少许的意思,级别最低的日志
              debug需要调试时候的打印关键信息
              info普通打印信息,也是默认日志级别
              warn警告,这个级别的日志不影响使用,但需要注意问题
              error错误信息,级别较高的错误日志信息
              fatal致命的,因为代码异常导致程序退出执行的事件

              3.2 日志级别有什么用呢?

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

              第一条也许比较难理解,我们写代码演示一下,我们知道日志等级默认的是info级别的,我们打印如下日志:

              @Controller
              @ResponseBody
              public class TestController {
                  
                  private final static Logger logger = LoggerFactory.getLogger(TestController.class);
                  
                  @RequestMapping("/sayHi")
                  public String sayHi(String name) {
                          logger.trace("----------- 我是 trace 级别的日志 -----------");
                          logger.debug("----------- 我是 debug 级别的日志 -----------");
                          logger.info("----------- 我是 info 级别的日志 -----------");
                          logger.warn("----------- 我是 warn 级别的日志 -----------");
                          logger.error("----------- 我是 error 级别的日志 -----------");
                      if(!StringUtils.hasLength(name)) {
                          name ="张三";
                      }
                      String res = "你好" + name;
                      return  res;
                  }
              

              观察控制台:

              SpringBoot 日志文件:日志的作用?为什么要写日志?,在这里插入图片描述,第6张

              你会新奇的发现,比info级别小的日志,没有出现在控制台,也就是没有打印,这就是第一条说的, 日志级别可以帮你筛选出重要的信息。

              3.3 日志级别的设置

              这个日志级别怎么有用,我们应该如何设置日志级别呢?答案是在配置文件(yaml文件或者properties文件)中设置,我们这里使用yaml文件。

              打印大于error级别的日志,如下图,:

              logging:
                level:
                  root: error
              

              设置完等级,我们再次启动项目,看看是否符合我们的预期,看下图,它符合我们的预期,只打印了 error级别的日志。

              SpringBoot 日志文件:日志的作用?为什么要写日志?,在这里插入图片描述,第7张

              4.日志持久化保存

              上方举得例子都是打印在控制台上的,然而在生产环境上需要将日志持久化保存下来,以便追溯问题位置。

              想要将日志进行持久化保存,只需要在配置文件中指定日志的存储目录或者指定日志保存文件名之后,SpringBoot 就会将控制台的日志写到我们配置的目录或文件中去。

              配置文件的保存路径:

              # 设置日志文件的目录
              logging:
                file:
                  path: F:\info\
              

              我们再次启动项目,打开设置好的路径,看看是否有日志保存:

              打开后可以看到有日志保存,证明我们的设置是正确的。

              SpringBoot 日志文件:日志的作用?为什么要写日志?,在这里插入图片描述,第8张

              5.更方便的日志输出

              每次打印日志,我们都是使用 LoggerFactory.getLogger(×××.class)这样的操作,代码显得冗余,我们可以使用更简单好用的日志输出方法,使用 lombok 来更简单的输出。

              其步骤大概分为两步:

              1. 添加 lombok 框架支持
              2. 使用 @Slf4j 注解输出日志

              5.1 添加 lombok 框架

              这个框架提供了非常多的简便注解,可以减少代码冗余,如果有需要可以去了解一下!

              
              		org.projectlombok
              		lombok
              		true
              
              

              5.2 使用注释输出日志

              我们在类上方添加@Slf4j注释,在使用时我们就会得到一个对象log对象。代码如下:

              @Controller
              @ResponseBody
              @Slf4j
              public class TestController {
                  @RequestMapping("/sayHi")
                  public String sayHi(String name) {
                          log.trace("----------- 我是 trace 级别的日志 -----------");
                          log.debug("----------- 我是 debug 级别的日志 -----------");
                          log.info("----------- 我是 info 级别的日志 -----------");
                          log.warn("----------- 我是 warn 级别的日志 -----------");
                          log.error("----------- 我是 error 级别的日志 -----------");
                      if(!StringUtils.hasLength(name)) {
                          name ="张三";
                      }
                      String res = "你好" + name;
                      return  res;
                  }
              }
              

              🎆总结

              1. 日志时程序中的重要组成部分,使用日志可以快速的发现和定位问题。
              2. 在配置文件中设置日志时,设置的等级越高,收到的日志信息也就越少。
              3. SpringBoot 内置了日志框架,默认情况下使用的是 info 日志级别打印在控制台上,我们可以通过配置文件将日志持久化。
              4. 在手搓日志中,代码有冗余,我们可以使用 lombok 提供的 @Slf4j 注解和 log对象 快速的打印自定义日志。