相关推荐recommended
教你如何使用 SpringBoot 日志
作者:mmseoamin日期:2023-12-20

1. 日志的作用

1.1 什么是日志?

  Spring Boot的日志是指在Spring Boot应用程序中记录事件和信息的机制。就是用来查 BUG 的,可以帮助我们快速定位和解决应用程序中的问题。

它的作用:

  • 帮助开发人员进行调试:当应用程序出现问题时,开发人员可以根据日志信息来追踪和定位问题。
  • 了解应用程序的运行情况:日志可以记录应用程序的各种事件和信息,例如应用程序启动和关闭、HTTP请求和响应、数据库操作等。
  • 维护应用程序的稳定性:通过设置适当的日志级别,可以避免过多的日志信息影响应用程序的性能。
  • 遵循安全和合规要求:根据应用程序的安全和合规要求,需要记录一些特定的日志信息,例如用户登录信息、敏感操作记录等。

    2. 自定义日志打印

      创建一个 SpringBoot项目后,我们点击运行,在控制台会弹出如下内容:

    教你如何使用 SpringBoot 日志,第1张

      这些其实就是系统自带的日志。那么我们如何自定义日志呢?

    2.1 获取日志对象

      

    import org.slf4j.Logger; //必须导这个包
    import org.slf4j.LoggerFactory;
    @RestController
    public class TestController {
        //1.得到日志对象(当前类的日志),
        private static final Logger log = LoggerFactory.getLogger(TestController.class);
        
        ......
        
        ......
    }
    复制代码

    教你如何使用 SpringBoot 日志,第2张

      有几个注意点,第一个是日志对象Logger的包是 slf4j,Spring Boot 中内置了日志框架 Slf4j,可以让开发人员使用一致的API来调用不同的日志记录框架;第二个,一般每个类都有自己的日志文件,getLogger方法参数推荐为当前这个类,并且这个日志文件不能轻易修改,所以是private static final。

    2.2 使对象打印日志

      Logger 提供了很多的方法用来打印日志。

    @ResponseBody //返回非静态页面
    @Controller
    public class TestController {
        //1.得到日志对象(当前类的日志)
        private static final Logger log = LoggerFactory.getLogger(TestController.class);
        @RequestMapping("/hi")
        public String Hi(){
            //打印日志的方法
            log.trace("我是trace");
            log.debug("我是debug");
            log.info("我是info");
            log.warn("我是warn");
            log.error("我是error");
            return "Hello World!";
        }
    }
    复制代码

      我们先运行程序:

    教你如何使用 SpringBoot 日志,第3张

      当我们访问这个方法的时候(浏览器输入路径)

    教你如何使用 SpringBoot 日志,第4张

    教你如何使用 SpringBoot 日志,第5张

      会看到只有访问到这个方法后日志才会出现,这才能体现日志的作用嘛;既然都是打印日志,为什么会提供这么多的方法呢?打印出来的内容都是什么意思呢?我明明写了5个方法,为什么只打印了3个呢?后面一一来解答:

    2.3 日志的格式

      日志的输出格式:

    教你如何使用 SpringBoot 日志,第6张

    3.日志的级别

      为什么我明明写了5个方法,为什么只打印了3个呢?这就是与日志级别相关了。

    3.1 日志级别的种类

      SpringBoot日志的级别用于控制输出日志的详细程度。

      每种不同的日志等级对应一组不同的日志信息,级别越高,输出的日志信息就越详细。各种日志级别的含义如下:

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

        SpringBoot中日志级别从低到高依次为:trace < debug < info < warn < error < fatal,默认的级别是info。

        日志的输出规则:当前的级别以及比当前级别高的日志才能输出(不会输出fatal),上面的 5 种不同的方法分别对应不同的日志级别,注意,没有fatal()方法,因为当出现fatal级别的时候程序就会被终止。

        这也就是上面写了5个方法,只打印了3个的原因。

      3.2 自定义日志的级别

        我们可以设置日志的级别,在SpringBoot的配置文件application.properties中:

      # 自定义日志级别
      logging.level.root=error
      复制代码

      教你如何使用 SpringBoot 日志,第7张

        现在:

      教你如何使用 SpringBoot 日志,第8张

        上面这是对根路径设置级别,还可以分别对不同的目录进行同时设置。

      # 自定义日志级别
      # 对根目录设置
      logging.level.root=error
      # 对controller 目录设置一个级别
      longing.level.com.example.demo.controller=trace  
      # 它们不会冲突,除了 com.example.demo.controller 下为 trace,其它地方都为error。
      复制代码

      教你如何使用 SpringBoot 日志,第9张

        默认的日志是在DemoApplication启动类中打印出来的。

      4. 日志的持久化

        持久化就是把日志放在硬盘上,存储为日志文件,这一步是非常重要的。

      4.1 配置文件路径

        在配置文件中设置配置文件的路径:

      # 设置日志文件的目录
      logging.file.path=D:\logging\  
      复制代码

        不用自己去创建这个路径,它会自动创建,开始运行并访问:

      教你如何使用 SpringBoot 日志,第10张

      教你如何使用 SpringBoot 日志,第11张

        它会默认在目录中创建一个文件,文件里面装了你自己写的日志内容。那么问题来了,我多次访问接口方法,它会覆盖掉这里面的内容吗?

      教你如何使用 SpringBoot 日志,第12张

        答案是不会的,它会在后面追加。

      4.2 配置文件名

        可以进一步精确到文件名:

      # 设置日志文件的文件名,注意这里是 name 属性
      logging.file.name=D:\logging\mySpring.log
      复制代码

      教你如何使用 SpringBoot 日志,第13张

        现在还有一个问题,如果程序运行时间周期很长(比如生产环境),那么日志一定是非常多的,用一个文件来存储显然不现实,那么如何让它自动地分成多个文件呢?

        可以设置日志文件存储大小的最大容量。

      # 设置日志大小的最大大小 1KB(一般不会这么小,这里用于演示)
      logging.logback.rollingpolicy.max-file-size=1KB
      复制代码

        这个配置项用于指定一个日志文件的最大大小,支持的单位包括 KB、MB、GB 等。,当日志文件达到指定大小后,将自动创建一个新的日志文件来继续记录日志信息,我以上面的代码为例,我经过多次请求后:

      教你如何使用 SpringBoot 日志,第14张

      5. 借助 lombok 输出日志

        lombok是一个框架,它能帮我们写get、set等方法,非常方便。

        用 lombok 输出日志其实非常简单,就是加一个注解:

      @Controller
      @ResponseBody
      @Slf4j //加上这个注解,它会自己生成一个日志对象,对象名叫“log”,直接引用。
      public class LogController {
          @RequestMapping("/hi")
          public String hi(){
              log.trace("我是trace");
              log.debug("我是debug");
              log.info("我是info");
              log.warn("我是warn");
              log.error("我是error");
              
              return "Hello World!";
          }
      }
      复制代码

      教你如何使用 SpringBoot 日志,第15张