文章目录

  • 日志的作用
  • 自定义日志
  • 常见的日志框架
  • 日志级别
  • 日志格式
  • 日志持久化
  • lombok
  • lombok原理解释
  • lombok常用注解
  • lombok优缺点


日志的作用

日志记录了系统行为的时间、地点、状态等相关信息,能够帮助我们了解并监控系统状态,在发生错误或者接近某种危险状态时能及时提醒我们处理,同时在系统产生问题,能够帮助我们快速定位、诊断问题。

自定义日志

在SpringBoot启动、运行时,控制台中就会输出日志信息:

spring boot 记录日志文件 springboot日志处理_后端


这些日志都是Spring中已经定义的,并非开发者自定义的日志。

如果想要输出自定义的日志,需要以下步骤:

1.在程序中得到日志对象

2.使用日志对象输出内容

获取日志对象:

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

使用日志对象输出内容:

//2.使用日志对象输出信息
  logger.info("这是日志记录的信息");

输出:

这是日志记录的信息

这里使用的Logger在slf4j包下,因为在SpringBoot中内置了slf4j日志框架,可以直接调用slf4j来输出日志。

spring boot 记录日志文件 springboot日志处理_spring boot_02

常见的日志框架

日志有两种框架模式,一个是门面模式,另一个是实现模式
门面模式也叫外观模式Facade),可以理解为是一层封装,对内部的子系统实现的封装,对外提供统一的接口,从而屏蔽了子系统在使用上的不同,大大降低了系统的使用难度,同时提高了系统的可维护性和可扩展性。
真正起作用的是子系统实现,外面的门面框架更像是一个服务人员,只起到对接作用。

常见的门面有两种:JCL(commons-logging)和SLF4j.

常见的实现框架有log4j1/2,jul,logback.

如下图:

spring boot 记录日志文件 springboot日志处理_spring boot 记录日志文件_03

SpringBoot底层是Spring,Spring默认使用的日志框架是JCL 门面,而SpringBoot使用的日志框架是SLF4J门面和logback实现日志。

springBoot底层依赖:

spring boot 记录日志文件 springboot日志处理_后端_04

日志级别

  • TRACE:普通微量的日志,级别最低的日志信息。
  • DEBUG:调试的时候的日志信息。TRACE和DEBUG级别的日志主要是对系统每一步的运行状态进行精确到记录。通过这种记录,可以查看某个操作每一步的执行情况,可以精确定位问题所在。
  • INFO:普通的日志信息,记录系统正常运行的状态,日志的默认级别
  • WARN:警告日志,出现的问题不影响使用,但需要注意。
  • ERROR:错误信息,级别较高的错误日志信息。这个级别的错误需要马上人工介入处理,但紧急程度低于fatal.ERROR和FATAL都是服务器自己的异常,像用户自己的操作不当等不应该被记为ERROR日志。
  • FATAL:致命错误,最高日志级别,表示需要立即被处理的系统级错误。当该错误发生时,表示服务已经出现了不可用,也可以说服务挂了,需要技术人员立即介入处理。一般情况下,一个进程的生命周期中应该只记录一次fatal级别的日志,即进程遇到无法恢复的错误推出执行时。

级别:

IOFO是默认的日志级别,我们可以在代码中对日志的级别进行设置,低于设置级别的日志就会被忽略(不显示)。

spring boot 记录日志文件 springboot日志处理_java_05


日志级别设置:

# 日志级别设置
logging:
   level:
     root: info

日志格式

spring boot 记录日志文件 springboot日志处理_spring boot 记录日志文件_06

日志持久化

不会将日志输出在控制台上,而是将日志保存下来,以便于出现问题的时候进行追溯,这个过程就叫做持久化。

设置日志持久化有两种方式:
1.设置日志的保存路径:
SpringBoot会按照自己的格式来生成日志文件并保存到相应的目录中。

# 日志持久化保存
logging:
  file:
    path: C:\logs\
  level:
    root: info

启动SpringBoot后,在C盘logs目录下就会出现日志文件

spring boot 记录日志文件 springboot日志处理_spring boot_07

2.设置日志的保存文件名:

# 日志持久化保存
logging:
  file:
    name: C:\log\spring-log.log
  level:
    root: info

运行springBoot,在对应目录下出现自定义文件名的日志:

spring boot 记录日志文件 springboot日志处理_spring boot 记录日志文件_08


默认情况下日志有一个最大日志的限制,max-size,当日志文件大小超过这个限制,springBoot就会重新创建一个日志,并进行报错。

lombok

SpringBoot默认的日志实现是Lombok,相比于获得日志对象logger打印日志,lombok是更简单的一种方式去打印日志。

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

在idea中下载插件EditStarters:

spring boot 记录日志文件 springboot日志处理_spring boot 记录日志文件_09


在pom.xml中右键,选择Generate,选择刚才下载好的插件

spring boot 记录日志文件 springboot日志处理_java_10


在插件中搜索lombok引入依赖:

spring boot 记录日志文件 springboot日志处理_spring_11


在测试类UserService中使用@Slf4j输出日志:

package com.example.demo.model;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;

@Service
@Slf4j
public class UserService {

    @PostConstruct
    private void postConstruct(){
        //打印日志
        log.error("我是 UserService 的构造方法日志error!");
        log.warn("这是一个警告信息日志!");
   
    }
}

输出:

spring boot 记录日志文件 springboot日志处理_spring_12

lombok原理解释

lombok本质上是一个工具,可以通过简单的注解形式来帮助我们简化一些必须有的Java代码。

比如我们在输出日志时,如果不使用lombok,需要手动获取日志对象logger,然后调用这个对象的方法。如果使用lombok,只需要加一个@Slf4j注解即可获得一个log对象,然后就可以输出日志。

那@Slf4j注解有啥用?

其实这个注解的作用就是自动帮我们获得logger对象,不需要我们手动创建,简化了代码。

我们编写的Java源代码需要转化成字节码文件进行执行,在idea目录中,target目录下就是所有的字节码文件,在字节码文件中我们查看UserService类:

spring boot 记录日志文件 springboot日志处理_spring boot_13


我们在写java源码时添加一些注解,然后lombok会进一步加工,根据对应的注解自动生成一些代码,然后整个源代码编译成字节码文件,最后在JVM上加载运行,如下图:

spring boot 记录日志文件 springboot日志处理_后端_14

lombok通过注解自动生成代码,核心是对注解进行解析,然后才能生成代码。

解析注解有两种方式:

  • 运行时解析
    运行时能解析的注解,必须将@Retention设置为RUNTIME,这样就可以通过反射拿到该注解。在java.lang.reflect包中提供了一个接口AnnotatedElement,这个接口中定义了获取注解信息的几个方法,而类、构造器、字段、方法、包等都实现了这个接口,自然能够获得获得注解信息
  • 编译时解析
    编译时解析又分为两种机制:
    1.Annotation Processing Tool工具包
    apt在JDK5产生,JDK7标记为过期,不推荐使用,在JDK8彻底删除,现在可以使用
    Pluggable Annotation Processing API来替换,apt工具包被替换的原因有两个:
  • 没有集成到javac中,需要额外运行
  • api集中在非标准包下
    2.Pluggable Annotation Processing API
    Pluggable Annotation Processing API也称为JSR 269,上面apt的替代方案,它解决了apt的缺陷,当我们通过javac执行的时候会调用这个api,javac的执行过程如下:

    Lombok本质上就是一个 “JSR API ”程序,在使用的过程中,具体流程如下:
  • 1.javac对源码解析,生成一个抽象语法树AST
  • 2.运行时调用JSR 269 API
  • 3.lombok对语法树进行处理,找到注解对应的树节点,进行修改
  • 4.javac将修改后的语法树生成字节码文件,给class文件增加新的代码块

lombok常用注解

  • @Getter:注解在类或者字段上,注解在类时为所有字段生成getter方法,注解在字段上时只为该字段生成getter方法
  • @Setter:使用方法同上,区别是生成的是getter方法
  • @ToString:注解在类,添加toString方法。
  • @EqualsAndHashCode:注解在类,生成hashCode和equals方法。
  • @NoArgsConstructor:注解在类,生成无参的构造方法
  • @RequiredArgsConstructor:注解在类,为类中需要特殊处理的字段生成构造方法
  • @AllArgsConstructor:注解在类,生成包含类中所有字段的构造方法
  • @Data:注解在类,生成setter和getter方法
  • @Slf4j:注解在类,生成log变量,用来输出日志,我们上面已经使用过了。

lombok优缺点

优点:

  • 通过注解自动生成代码,增加了开发效率
  • 代码变得简洁,无需过多关注相应方法
  • 维护成本降低

缺点:

  • 不支持多参数构造方法
  • 过于简洁,可读性和完整性较差,增加了代码阅读难度