【JavaEE Spring】SpringBoot 日志文件详解

目录

  • 1. 日志的作用
  • 2. springboot 默认日志信息
  • 3. 自定义打印日志
    • 3.1 在程序中得到日志对象
    • 3.2 使用日志对象打印日志
    • 3.3 日志格式说明
  • 4. 关于日志级别
    • 4.1 日志级别的分类与使用
    • 4.2 日志配置
  • 5. 日志持久化
  • 6. 使用 lombok 实现更简单的日志输出
    • 6.1 使用Edit Starters插件进行快速添加框架至项目
    • 6.2 使用 lombok 输出日志
    • 6.3 lombok 更多注解说明
    • 6.4 lombok 原理解释

1. 日志的作用

日志最主要的作用就是排除和定位问题。
除了发现和定位问题之外,日志还具有如下功能:

  • 记录用户登录日志,方便分析用户是正常登录还是恶意破解用户。
  • 记录系统的操作日志,方便数据恢复和定位操作人。
  • 记录程序的执行时间,方便为以后优化程序提供数据支持。

2. springboot 默认日志信息

Spring Boot 项目在启动时默认就有日志输出,如下图:
【JavaEE Spring】SpringBoot 日志文件详解_第1张图片
以上内容就是 Spring Boot 输出的控制台日志信息。springboot默认能在控制台输入日志信息说明:

  • springboot 内置了日志框架

3. 自定义打印日志

自定义打印日志实现步骤:

  • 在程序中得到日志对象
  • 使用日志对象的相关语法输出要打印的日志内容

3.1 在程序中得到日志对象

在程序中获取⽇志对象需要使⽤日志工厂 LoggerFactory,如下代码所示:

 // 1.得到日志对象
    private static final Logger log= LoggerFactory.getLogger(UserController.class);

(日志工厂需要将每个类的类型传递进去,这样我们才知道⽇志的归属类,才能更⽅便、更直观的定位到问题类)

注意:Logger 对象是属于 org.slf4j 包下的
【JavaEE Spring】SpringBoot 日志文件详解_第2张图片
Slf4j是 springboot 中内置的日志框架,可以直接在程序中调用slf4j来输出日志

slf4j属于日志门面(相当于代理),日志实现其实是logback。(门面模式)
【JavaEE Spring】SpringBoot 日志文件详解_第3张图片

门面模式的优点:可以保证日志实现框架变化的情况下(比如从logback->log4j 1/2)时,开发者不必关注变化的细节,还是依旧使用slf4j这个代理来实现日志的打印,代码不必做出调整或调整很少,大大降低了开发的难度/复杂度。

3.2 使用日志对象打印日志

@Controller
@ResponseBody
public class UserController {

    // 1.得到日志对象
    private static final Logger log= LoggerFactory.getLogger(UserController.class);

    // 2.使用日志对象log打印日志
    @RequestMapping("/sayhi")
    public void sayHi(){
        log.trace("我是trace");
        log.debug("我是debug");
        log.info("我是info");
        log.warn("我是warn");
        log.error("我是error");
    }
}

在浏览器中访问了相应的路由地址后发现日志成功打印~ (springboot默认日志级别是info ,大于等于info级别的日志能成功打印,次日志级别可以手动更改)
【JavaEE Spring】SpringBoot 日志文件详解_第4张图片

3.3 日志格式说明

在这里插入图片描述

4. 关于日志级别

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

有了⽇志级别之后就可以过滤⾃⼰想看到的信息了,⽐如设置⽇志级别为 error,那么就可以只看程序的报错⽇志了,对于普通的调试⽇志和业务⽇志就可以忽略了,从⽽节省开发者的信息筛选时间。

4.1 日志级别的分类与使用

日志级别分为:

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

日志级别的顺序:
【JavaEE Spring】SpringBoot 日志文件详解_第5张图片
越往上接收到的消息就越少

4.2 日志配置

⽇志级别配置只需要在配置⽂件中设置“logging.level”配置项即可,如下所示:
【JavaEE Spring】SpringBoot 日志文件详解_第6张图片
(在application.yml 配置文件中进行配置,配置根路径的日志级别,设置了当前全局日志级别为error)

配置 controller 文件夹下的日志级别为 error :
【JavaEE Spring】SpringBoot 日志文件详解_第7张图片
此时访问相应路由只在控制台上输出级别为error的日志信息:
在这里插入图片描述

5. 日志持久化

以上的⽇志都是输出在控制台上的,然⽽在⽣产环境上咱们需要将⽇志保存下来,以便出现问题之后追溯问题,把⽇志保存下来的过程就叫做持久化。

想要将⽇志进⾏持久化,只需要在配置⽂件中指定日志的存储⽬录或者是指定日志保存文件名之后,Spring Boot 就会将控制台的⽇志写到相应的⽬录或⽂件下了。

配置日志⽂件的保存路径:
【JavaEE Spring】SpringBoot 日志文件详解_第8张图片
此时去相应路径下查看:
【JavaEE Spring】SpringBoot 日志文件详解_第9张图片
日志持久化(保存到硬盘)成功;并且每次重启springboot项目日志信息是进行追加的,而不是重写的 ~
【JavaEE Spring】SpringBoot 日志文件详解_第10张图片
配置日志文件的⽂件名(一般实现是通过绝对路径(路径+文件名)的形式实现的):
【JavaEE Spring】SpringBoot 日志文件详解_第11张图片

打开相应路径显示:
在这里插入图片描述
同样,日志文件持久化成功~

6. 使用 lombok 实现更简单的日志输出

因为每次都使用 LoggerFactory.getLogger(xxx.class) 很繁琐,且每个类都添加⼀遍,也很麻烦;我们还可以使用 lombok 来更简单的输出,解决上述的繁琐问题

基本步骤:

  • 添加 lombok 框架⽀持。
  • 使⽤ @slf4j 注解输出日志。

6.1 使用Edit Starters插件进行快速添加框架至项目

【JavaEE Spring】SpringBoot 日志文件详解_第12张图片
【JavaEE Spring】SpringBoot 日志文件详解_第13张图片

6.2 使用 lombok 输出日志

代码如下:

@Controller
@Slf4j
@ResponseBody
public class LombokController {

    @RequestMapping("/log")
    public void loggerTest(){
        log.error("我是用lombok输出的error日志");
    }
}

在这里插入图片描述
(注意:使用 @Slf4j 注解,在程序中使⽤ log 对象即可输⼊⽇志,并且只能使⽤ log 对象才能输出,这是 lombok 提供的对象名)

6.3 lombok 更多注解说明

基本注解:

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

组合注解:
【JavaEE Spring】SpringBoot 日志文件详解_第14张图片
日志注解:
在这里插入图片描述

6.4 lombok 原理解释

target 为项目最终执⾏的代码,查看 target ⽬录如下:
【JavaEE Spring】SpringBoot 日志文件详解_第15张图片
target目录下的为Java目录下的源代码经过编译后形成的能被jvm识别使用的 .class文件(字节码文件)

打开 刚刚使用过 @Slf4j 注解的LombokController 类的字节码文件如下:
(因为idea打开,所以字节码文件能够显示,其他软件打开就不一定能显示为Java代码了~)

【JavaEE Spring】SpringBoot 日志文件详解_第16张图片
Java 程序的运⾏原理:
【JavaEE Spring】SpringBoot 日志文件详解_第17张图片
Lombok作用的结果如下图 :
【JavaEE Spring】SpringBoot 日志文件详解_第18张图片
也就是说lombok在程序编译阶段就把相应注解变成了相应的对象,来执行相应的功能(比如这里的日志输出),然后把编译完成的class文件给jvm来进行加载运行 ~

lombok起作用的阶段就是程序的编译阶段(.java -> .class)

  • over ~ ~

你可能感兴趣的:(spring,Java学习之旅,JavaEE,spring,boot,spring,java-ee)