Spring Boot 日志

Spring Boot 日志

​ 在 Spring Boot 里面是有一个内置了的日志框架的,所以才能运行的时候在控制台打印出来。默认情况下的日志是系统定义和打印的,但我们也可以自行自定义打印日志。

日志的好处:

1、发现问题和定位问题;☆(最常见,最实用)

2、记录用户的登录信息,方便大数据分析;

3、记录操作日志,方便追溯操作人;

4、记录方法的执行时间,方便后续程序的优化。

一、日志打印

在程序中自定义日志

1.1、在程序中得到打印日志的对象

首先需要在程序中使用 日志工厂 LoggerFactory:

private static Logger logger = LoggerFactory.getLogger(LoginController.class);

.getLogger() 里面是当前类,当前类.class

注意:在引用日志工厂的时候需要在 orj.slf4j 这个包下面导入,不要导入错包

image-20230730164405592

使用 slf4j 框架说明:

image-20230730170724763

​ 在 Spring Boot 中 slf4j 相当于一个门面,访问里面的日志实现首先需要通过门面这个渠道才能访问到后面的日志实现。就好比如日常生活需要网购,网购都需要借助平台才能具体的访问到商家进行购物,这里的 slf4j 是一个道理,只有进入 slf4j 这个包才能进行后面一下的操作,具体实现的日志是哪一个这个 Spring Boot 系统自动使用的,默认情况下使用的是 logback。

2.1、日志级别

​ 日志对象打印的方法有很多种,他们每一种都是有级别的,简单理解就是过滤掉冗余不需要的日志,可以自己自定义想看的日志类型方便排查问题,他们级别分别是:

image-20230730173208841

​ 打印的日志内容也是从低到高,就比如说,打印的是 info 级别,那么info 级别->error 级别的日志都会打印出来,后面以此类推。

里面的 fatal 是调用不出来的,因为他直接是致命程序运行不了出现终断退出等现象,不是程序员可以调用的,这个方法是系统里面自己调用的

@Controller
@ResponseBody
public class LoginController {

    private static Logger logger = LoggerFactory.getLogger(LoginController.class);

    //localhost:9090/login.html
    @RequestMapping("/login") // url 与前端的 ajax 参数 url 要一致
    public String login(String username, String password) { // SpringBoot可以直接传参自动获得request对象调用getparameter方法
        logger.trace("日志级别 trace");
        logger.debug("日志级别 debug");
        logger.info("日志级别 info");
        logger.warn("日志级别 warn");
        logger.error("日志级别 error");
    }
}

打印日志结果及日志格式说明:

在这里插入图片描述

​ 从日志结果信息来看,日志默认级别是 info ,只有info之后才有日志内容,

总结日志自定义打印:

1、使用 日志工厂 这个对象 LoggerFactory,导包是导 orj.slf4j 这个包;

2、根据这个对象调用方法,调用的方法有5种,就是这个日志级别

二、在配置里面配置日志 (日志使用)

​ 日志的级别配置,只需要在配置文件里面设置 logging.level 即可。

# 配置日志
logging:
  level:
    root: error

这个代码表示,root 在这个项目属于根目录也就是说所有项目目录级别都是配置的 error级别。

logging:
  level:
    root: error
    com:
      example:
        demo:
          controller: info

这个代码表示,在指定路径下的项目程序设置的日志是 info 级别;当 root 和 指定路径同时在的时候优先执行指定的目录。

三、日志持久化

​ 在控制台里面输出的是都不能长期保存,idea 一关日志就没了,但是在之后的生产环境中需要把日志长期保存下来,以便后续可以追溯问题,那么把日志保存下来的过程就叫做持久化。

在yml配置文件里配置日志文件的保存路径:

# 配置日志
logging:
  file:
    path: E:file # 日志保存路径

​ 这样他就可以在指定的目录生成日志文件了。Spring Boot 就会将控制台的日志写在相应的目录下。

# 配置日志
logging:
  file:
    name: E:filespring Boot.log

​ 这是个文件设定名称,可以在保存日志的时候自定义名称,当有多个日志的时候,Spring Boot 它会自动在后面加上数字,非常的方便。

四、更简单的日志输出——lombok

​ Spring Boot 大多数都是可以用注解解决问题的,输出日志也是不例外,之前使用 日志工厂 LoggerFactory.getLogger(xxx.class) ,如果需要多个不同类的日志那么这样添加起来就很麻烦,这里就是用更简单的日志输出方式,使用lombok 提供的注解 @slf4jlog 对象快速的打印自定义日志。

1、首先添加 lombok 的依赖在 pom.xml 中

<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
</dependency>

2、使用注解 @Slf4j ,输出日志

@Controller
@ResponseBody
@Slf4j
public class LoginController {

//    private static Logger logger = LoggerFactory.getLogger(LoginController.class);
    @RequestMapping("/login") 
    public String login(String username, String password) { 
        log.trace("日志级别 trace");
        log.debug("日志级别 debug");
        log.info("日志级别 info");
        log.warn("日志级别 warn");
        log.error("日志级别 error");
    }
}

​ 使用了注解就不必再使用日志工厂了,但是程序是使用的 log 对象进行输入日志,并且只有 log 对象才能输出,这是 lombok 提供的对象名。

五、lombok原理分析

​ lombok 的实现原理,它是在 java 整个程序中的编码阶段进行处理的

image-20230731123741147

​ 它在编译的时候生成taget 目录,看看生成字节码的里面的代码

image-20230731124018678

​ 这样就可以说明 lombok 在编译期间的时候把注解 @slf4j 给替换掉了,生成字节码文件的时候又自动把日志厂的对象给编译在代码中。这些都是因为 lombok 通过遵循 jdk 编译期增强的规范,实现了一个 java 源代码在生成字节码的时候的功能增强。其中就比如: @slf4j;@Setter/@Getter …

lombok更多注解:

注解 作用
@Getter ⾃动添加 getter ⽅法
@Setter ⾃动添加 setter ⽅法
@ToString ⾃动添加 toString ⽅法
@EqualsAndHashCode ⾃动添加 equals 和 hashCode ⽅法
@NoArgsConstructor ⾃动添加⽆参构造⽅法
@AllArgsConstructor ⾃动添加全属性构造⽅法,顺序按照属性的定义顺序
@NonNull 属性不能为 null
@RequiredArgsConstructor ⾃动添加必需属性的构造⽅法,final + @NonNull 的 属性为必需

注解的组合:

注解 作用
@Data @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor +@NoArgsConstructor

日志注解:

注解 作用
@Slf4j 添加⼀个名为 log 的⽇志,使⽤ slf4j