1. 日志的作用

1.1 什么是日志?

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

它的作用:

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

2. 自定义日志打印

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

springboot取消控制台打印sql springboot不打印debug日志_spring

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

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取消控制台打印sql springboot不打印debug日志_spring_02

  有几个注意点,第一个是日志对象Logger的包是 slf4jSpring 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取消控制台打印sql springboot不打印debug日志_java_03

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

springboot取消控制台打印sql springboot不打印debug日志_应用程序_04

springboot取消控制台打印sql springboot不打印debug日志_应用程序_05

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

2.3 日志的格式

  日志的输出格式:

springboot取消控制台打印sql springboot不打印debug日志_日志文件_06

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取消控制台打印sql springboot不打印debug日志_spring boot_07

  现在:

springboot取消控制台打印sql springboot不打印debug日志_spring_08

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

# 自定义日志级别

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

springboot取消控制台打印sql springboot不打印debug日志_java_09

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

4. 日志的持久化

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

4.1 配置文件路径

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

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

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

springboot取消控制台打印sql springboot不打印debug日志_应用程序_10

springboot取消控制台打印sql springboot不打印debug日志_spring boot_11

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

springboot取消控制台打印sql springboot不打印debug日志_日志文件_12

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

4.2 配置文件名

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

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

springboot取消控制台打印sql springboot不打印debug日志_java_13

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

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

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

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

springboot取消控制台打印sql springboot不打印debug日志_spring_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取消控制台打印sql springboot不打印debug日志_spring_15