SpringBoot 日志
- [1. 日志概述](#1. 日志概述)
- [2. 日志使用](#2. 日志使用)
-
- [2.1 打印⽇志](#2.1 打印⽇志)
-
- [2.1.1 在程序中得到⽇志对象](#2.1.1 在程序中得到⽇志对象)
- [2.1.2 使⽤⽇志对象打印⽇志](#2.1.2 使⽤⽇志对象打印⽇志)
- [2.2 ⽇志框架介绍](#2.2 ⽇志框架介绍)
-
- [2.2.1 ⻔⾯模式(外观模式)](#2.2.1 ⻔⾯模式(外观模式))
- [2.2.2 SLF4J 框架介绍](#2.2.2 SLF4J 框架介绍)
- [2.3 ⽇志格式的说明](#2.3 ⽇志格式的说明)
- [2.4 ⽇志级别](#2.4 ⽇志级别)
-
- [2.4.1 ⽇志级别的分类](#2.4.1 ⽇志级别的分类)
- [2.4.2 ⽇志级别的使⽤](#2.4.2 ⽇志级别的使⽤)
- [2.5 ⽇志配置](#2.5 ⽇志配置)
-
- [2.5.1 配置⽇志级别](#2.5.1 配置⽇志级别)
- [2.5.2 ⽇志持久化](#2.5.2 ⽇志持久化)
- [2.5.3 配置⽇志⽂件分割](#2.5.3 配置⽇志⽂件分割)
- [2.5.4 配置⽇志格式](#2.5.4 配置⽇志格式)
- [3. 更简单的⽇志输出](#3. 更简单的⽇志输出)
-
- [3.1 添加 lombok 依赖](#3.1 添加 lombok 依赖)
- [3.2 输出⽇志](#3.2 输出⽇志)
- [4. 总结](#4. 总结)
1. 日志概述
为什么要学习日志
- 对于平常来说, 我们就在使⽤
System.out.print
来打印⽇志了 - 随着项⽬的复杂度提升, 我们对⽇志的打印也有了更⾼的需求, ⽽不仅仅是定位排查问题.
- 有时候我们需要将日志持久化, 进行对应的数据分析, 但是
System.out.print
不能很好的满⾜我们的需求, 我们就需要使⽤⼀些专⻔⽇志框架(专业的事情交给专业的⼈去做).
日志的用途
通过前⾯的学习, 我们知道⽇志主要是为了发现问题, 分析问题, 定位问题的, 但除此之外, ⽇志还有很多⽤途
- 系统监控
- 数据采集
- ⽇志审计
2. 日志使用
Spring Boot 项⽬在启动的时候默认就有⽇志输出,如下图所⽰:
SpringBoot 内置了⽇志框架 Slf4j , 我们可以直接在程序中调⽤ Slf4j 来输出⽇志
2.1 打印⽇志
打印⽇志的步骤:
- 在程序中得到⽇志对象.
- 使⽤⽇志对象输出要打印的内容.
2.1.1 在程序中得到⽇志对象
在程序中获取⽇志对象需要使⽤⽇志⼯⼚ LoggerFactory,如下代码所⽰:
java
private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
LoggerFactory.getLogger 需要传递⼀个参数, 标识这个⽇志的名称. 这样可以更清晰的知道是哪个类输出的⽇志. 当有问题时, 可以更⽅便直观的定位到问题类
注意:Logger 对象是属于 org.slf4j 包下的 , 不要导⼊错包.
2.1.2 使⽤⽇志对象打印⽇志
⽇志对象的打印⽅法有很多种,我们可以先使⽤ info() ⽅法来输出⽇志,如下代码所⽰:
2.2 ⽇志框架介绍
2.2.1 ⻔⾯模式(外观模式)
SLF4J是⻔⾯模式的典型应⽤(但不仅仅使⽤了⻔⾯模式).
⻔⾯模式定义
门面模式又称为外观模式, 提供了一个统一接口, 用来访问子系统中的一群接口, 其主要特征是定义了一个高层接口, 让子系统更容易使用.
⻔⾯模式主要包含2种⻆⾊:
- 外观⻆⾊(Facade): 也称⻔⾯⻆⾊,系统对外的统⼀接⼝.
- ⼦系统⻆⾊(SubSystem): 可以同时有⼀个或多个 SubSystem. 每个 SubSytem 都不是⼀个单独的类,⽽是⼀个类的集合. SubSystem 并不知道 Facade 的存在, 对于 SubSystem ⽽⾔, Facade 只是另⼀个客⼾端⽽已(即 Facade 对 SubSystem 透明)
⻔⾯模式的实现
场景: 回家, 我们会开各个屋的灯. 离开家时, 会关闭各个屋的灯
如果家⾥设置⼀个总开关, 来控制整个屋的灯就会很⽅便
我们使⽤⻔⾯模式的实现
⻔⾯模式的优点
- 减少了系统的相互依赖. 实现了客户端与子系统的耦合关系, 这使得子系统的变化不会影响到调用它的客户端;
- 提高了灵活性, 简化了客户端对子系统的使用难度, 客户端无需关心子系统的具体实现方式, 而需要和门面对象交互即可.
- 提高了安全性, 可以灵活设定访问权限, 不在门面对象中开通方法, 就无法访问
2.2.2 SLF4J 框架介绍
SLF4J 就是其他⽇志框架的⻔⾯. SLF4J 可以理解为是提供⽇志服务的统⼀API接⼝, 并不涉及到具体的⽇志逻辑实现.
不引⼊⽇志⻔⾯
引⼊⽇志⻔⾯
总的来说,SLF4J使你的代码独⽴于任意⼀个特定的⽇志API,这是⼀个对于开发API的开发者很好的思想.
2.3 ⽇志格式的说明
从上图可以看到,⽇志输出内容元素具体如下:
- 时间⽇期:精确到毫秒
- ⽇志级别:ERROR, WARN, INFO, DEBUG 或TRACE
- 进程ID
- 线程名
- Logger名(通常使⽤源代码的类名)
- ⽇志内容
2.4 ⽇志级别
⽇志级别代表着⽇志信息对应问题的严重性, 为了更快的筛选符合⽬标的⽇志信息.
2.4.1 ⽇志级别的分类
⽇志的级别从⾼到低依次为: FATAL、ERROR、WARN、INFO、DEBUG、TRACE
2.4.2 ⽇志级别的使⽤
⽇志级别是开发⼈员⾃⼰设置的. 开发⼈员根据⾃⼰的理解来判断该信息的重要程度
SpringBoot 默认的⽇志框架是Logback, Logback没有 FATAL 级别, 它被映射到 ERROR .
出现fatal⽇志,表⽰服务已经出现了某种程度的不可⽤, 需要需要系统管理员紧急介⼊处理. 通常情况下, ⼀个进程⽣命周期中应该最多只有⼀次FATAL记录.
观察打印的⽇志结果:
结果发现, 只打印了info, warn和error级别的⽇志
这与⽇志级别的配置有关, ⽇志的输出级别默认是 info级别, 所以只会打印⼤于等于此级别的⽇志, 也就是info, warn和error.
2.5 ⽇志配置
上述是⽇志的使⽤, ⽇志框架⽀持我们更灵活的输出⽇志, 包括内容, 格式等.
2.5.1 配置⽇志级别
⽇志级别配置只需要在配置⽂件中设置"logging.level"配置项即可,如下所⽰:
2.5.2 ⽇志持久化
以上的⽇志都是输出在控制台上的, 然⽽在线上环境中, 我们需要把⽇志保存下来, 以便出现问题之后追溯问题. 把**⽇志保存下来就叫持久化**.
⽇志持久化有两种⽅式
- 配置⽇志⽂件名
- 配置⽇志的存储⽬录
配置⽇志⽂件的路径和⽂件名:
后⾯可以跟绝对路径或者相对路径
运⾏结果显⽰, ⽇志内容保存在了对应的⽬录下
注意:
logging.file.name
和 logging.file.path
两个都配置的情况下, 只⽣效其⼀, 以
logging.file.name
为准.
2.5.3 配置⽇志⽂件分割
如果我们的⽇志都放在⼀个⽂件中, 随着项⽬的运⾏, ⽇志⽂件会越来越⼤, 需要对⽇志⽂件进⾏分割.
当然, ⽇志框架也帮我们考虑到了这⼀点, 所以如果不进⾏配置, 就⾛⾃动配置
默认⽇志⽂件超过10M就进⾏分割
配置⽇志⽂件分割:
- ⽇志⽂件超过1KB就分割(设置1KB是为了更好展⽰. 企业开发通常设置为200M, 500M等, 此处没有明确标准)
- 分割后的⽇志⽂件名为: ⽇志名.⽇期.索引
项⽬运⾏, 多打印⼀些⽇志, ⽇志分割结果:
2.5.4 配置⽇志格式
⽬前⽇志打印的格式是默认的
3. 更简单的⽇志输出
每次都使⽤ LoggerFactory.getLogger(xxx.class) 很繁琐, 且每个类都添加⼀遍, lombok给我们提供了⼀种更简单的⽅式.
- 添加 lombok 框架⽀持
- 使⽤ @Slf4j 注解输出⽇志。
3.1 添加 lombok 依赖
xml
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
3.2 输出⽇志
4. 总结
- ⽇志是程序中的重要组成部分,使⽤⽇志可以快速的发现和定位问题,Spring Boot 内容了⽇志框架,默认情况下使⽤的是 info ⽇志级别将⽇志输出到控制台的,我们可以通过 lombok 提供的@Slf4j 注解和 log 对象快速的打印⾃定义⽇志.
- ⽇志包含 6 个级别, ⽇志级别越⾼,收到的⽇志信息也就越少,我们可以通过配置⽇志的保存名称或保存⽬录来将⽇志持久化.