Spring Boot—日志文件

111 阅读6分钟

日志作用

​ 日志是程序的重要组成部分,想象⼀下,如果程序报错了,不让你打开控制台看⽇志,那么你能找到报错的原因吗?答案是否定的,写程序不是买彩票,不能完全靠猜,因此日志对于我们来说,最主要的⽤途就是排除和定位问题。除了发现和定位问题之外,我们还可以通过日志实现以下功能:

  • 记录⽤户登录日志,⽅便分析⽤户是正常登录还是恶意破解⽤户;

  • 记录系统的操作日志,⽅便数据恢复和定位操作⼈;

  • 记录程序的执行时间,⽅便为以后优化程序提供数据⽀持;

以上这些都是日志提供的⾮常实⽤的功能

日志的格式

image-20230506211544743

  • 注意: 执行的类名, 是指在哪个类中打印了日志信息

日志框架

image-20230506211640233

  • 日志门面使用了门面模式, 即SLF4J并不实际处理日志, 只是接受请求, 然后把请求发给日志实现中的框架.

日志级别

  • 作用: ⽇志的级别就是为了筛选符合⽬标的⽇志信息的。

  • 分类:

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

    越往下接收到的消息就越少。

    image-20230506211127589

日志配置

logging:
  level:
    root: info  # 设置全局的日志级别
    com:
      example:
        spingboot_log:
          controller: trace  # 设置局部的日志级别(这里是到了文件夹级别)
  • 当存在局部日志级别和全局的日志设置, 那么当访问局部日志时, 使用的是局部日志级别, 也就是"局部日志级别优先级 > 全局日志优先级"
  • 一般日志级别设置到文件夹级别, 不会设置到具体某个类级别

日志持久化

​ ⽇志一般都是输出在控制台上的,然⽽在⽣产环境上咱们需要将日志保存下来,以便出现问题之后追溯问题,把日志保存下来的过程就叫做持久化。想要将日志进⾏持久化,只需要在配置⽂件中指定日志的存储目录或者是指定⽇志保存⽂件名之后,Spring Boot 就会将控制台的日志写到相应的目录或⽂件下了。

配置日志文件的保存路径

  1. 第一种方式: 配置日志文件的保存路径

    # 设置⽇志⽂件的⽬录  
    logging:
     file:
       path: D:\home\SpringBoot.log
    
    • 这种只指定文件保存路径, 不指定保存名称, 系统会自动生成文件名称

    • 有时候在windows中,“\ + 字符”, 会发生转义,那么我们可以使用双“ \\ + 字符”的方式活着使用将"\"换成“/”(在Linux中,使用“/”,作为文件分隔符)

  2. 第二种方式: 配置日志文件的文件名

    # 设置⽇志⽂件的⽂件名
    logging:
     file:
       name: D:\IDEA\spring-1204.log
    

注意:

  1. 打印日志信息, 是以追加的方式, 写入到日志文件中的, 也就是说新的日志信息不会覆盖老的日志信息.
  2. 如果日志文件的大于一定值时, 系统就会自动将日志文件分开多个.

自定义打印日志

Spring Boot的日志

image-20230506212116660

以上内容就是 Spring Boot 输出的控制台⽇志信息。Spring Boot 内置了⽇志框架(不然也输出不了⽇志)。默认情况下,输出的⽇志并⾮是开发者定义和打印的

打印日志的方式

大体步骤

  1. 获取日志对象;
  2. 使用日志对象打印日志信息.

第一种方式: 使用自定义的日志对象打印日志

package com.example.springboot_1.controllerUser;

import org.slf4j.Logger;    // Logger是slf4j包里面的
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author sgj
 * @create 2023-05-07 11:53
 */

@Controller
@ResponseBody
public class ControllerUser {
    private static Logger logger = LoggerFactory.getLogger(ControllerUser.class); // 之所以传入类类型, 是因																					  为要明确日志信息从哪个																					  类中打出
    @RequestMapping("/sayhi")
    public static void sayHi() {
        logger.trace("I am trace");
        logger.info("I am info");
        logger.debug("I am debug");
        logger.warn("I am warn");
        logger.error("I am error");
    }
}

第二种方式: 使用lombok提供的日志对象打印对象

package com.example.springboot_1.controllerUser;

import lombok.extern.slf4j.Slf4j;
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;

/**
 * @author sgj
 * @create 2023-05-07 11:53
 */

@Controller
@ResponseBody
@Slf4j
public class ControllerUser {

    @RequestMapping("/sayhi")
    public static void sayHi() {
        log.trace("I am trace");   // log是@SLf4j提供的对象
        log.info("I am info");
        log.debug("I am debug");
        log.warn("I am warn");
        log.error("I am error");
    }
}

lombok

在pom.xml添加lombok依赖

如果在创建项目的时候没有添加lombok依赖, 也可以在创建项目后添加lom依赖, 具体方式如下:

  1. 添加EditStarters插件

    image-20230507121059428

  2. 在pom文件中, 依次进行如下操作:

  • 右键后点击Generate

image-20230507121138251

  • 点击Edit Starters

image-20230507121150571

  • 搜索lombok,然后添加即可

image-20230507121228758

lombok的作用

// ControllerUser.java
@Controller
@ResponseBody
@Slf4j
public class ControllerUser {

    @RequestMapping("/sayhi")
    public static void sayHi() {
        log.trace("I am trace");
        log.info("I am info");
        log.debug("I am debug");
        log.warn("I am warn");
        log.error("I am error");
    }
}

// ControllerUser.class
@Controller
@ResponseBody
public class ControllerUser {
    private static final Logger log = LoggerFactory.getLogger(ControllerUser.class);

    public ControllerUser() {
    }

    @RequestMapping({"/sayhi"})
    public static void sayHi() {
        log.trace("I am trace");
        log.info("I am info");
        log.debug("I am debug");
        log.warn("I am warn");
        log.error("I am error");
    }
}

可以通过java和class文件的对比可以发现,使用lombok注解,帮我们生成了日志对象log,这样就不用我们自定义日志对象了。原理如下图所示:

image-20230507122017540

lombok的注解

基本注解

image-20230507122641226

组合注解

image-20230507122708752

日志注解

image-20230507122727067

总结

  1. ⽇志是程序中的重要组成部分,使⽤⽇志可以快速的发现和定位问题

  2. Spring Boot 内置了⽇志框架

  3. 默认情况下使⽤的是 info ⽇志级别将⽇志输出到控制台的

  4. 可以通过 lombok 提供的 @Slf4j 注解和 log 对象快速的打印⾃定义⽇志

  5. 日志包含 6 个级别:

    • trace:微量,少许的意思,级别最低;

    • info:普通的打印信息;

    • debug:需要调试时候的关键信息打印;

    • warn:警告,不影响使⽤,但需要注意的问题;

    • error:错误信息,级别较⾼的错误⽇志信息;

    • fatal:致命的,因为代码异常导致程序退出执⾏的事件。

​ 日志级别依次提升,而界别越⾼,收到的日志信息也就越少,我们可以通过配置⽇志的保存名称或

​ 保存目录来将日志永久地保存下来。