【JavaEE & Spring】SpringBoot 日志

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 不能很好的满⾜我们的需求, 我们就需要使⽤⼀些专⻔⽇志框架(专业的事情交给专业的⼈去做).

日志的用途

通过前⾯的学习, 我们知道⽇志主要是为了发现问题, 分析问题, 定位问题的, 但除此之外, ⽇志还有很多⽤途

  1. 系统监控
  2. 数据采集
  3. ⽇志审计

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 ⽇志格式的说明

从上图可以看到,⽇志输出内容元素具体如下:

  1. 时间⽇期:精确到毫秒
  2. ⽇志级别:ERROR, WARN, INFO, DEBUG 或TRACE
  3. 进程ID
  4. 线程名
  5. Logger名(通常使⽤源代码的类名)
  6. ⽇志内容

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 ⽇志持久化

以上的⽇志都是输出在控制台上的, 然⽽在线上环境中, 我们需要把⽇志保存下来, 以便出现问题之后追溯问题. 把**⽇志保存下来就叫持久化**.

⽇志持久化有两种⽅式

  1. 配置⽇志⽂件名
  2. 配置⽇志的存储⽬录


配置⽇志⽂件的路径和⽂件名:

后⾯可以跟绝对路径或者相对路径

运⾏结果显⽰, ⽇志内容保存在了对应的⽬录下

注意:
logging.file.namelogging.file.path 两个都配置的情况下, 只⽣效其⼀, 以
logging.file.name 为准.

2.5.3 配置⽇志⽂件分割

如果我们的⽇志都放在⼀个⽂件中, 随着项⽬的运⾏, ⽇志⽂件会越来越⼤, 需要对⽇志⽂件进⾏分割.

当然, ⽇志框架也帮我们考虑到了这⼀点, 所以如果不进⾏配置, 就⾛⾃动配置

默认⽇志⽂件超过10M就进⾏分割

配置⽇志⽂件分割:

  1. ⽇志⽂件超过1KB就分割(设置1KB是为了更好展⽰. 企业开发通常设置为200M, 500M等, 此处没有明确标准)
  2. 分割后的⽇志⽂件名为: ⽇志名.⽇期.索引

项⽬运⾏, 多打印⼀些⽇志, ⽇志分割结果:

2.5.4 配置⽇志格式

⽬前⽇志打印的格式是默认的

3. 更简单的⽇志输出

每次都使⽤ LoggerFactory.getLogger(xxx.class) 很繁琐, 且每个类都添加⼀遍, lombok给我们提供了⼀种更简单的⽅式.

  1. 添加 lombok 框架⽀持
  2. 使⽤ @Slf4j 注解输出⽇志。

3.1 添加 lombok 依赖

xml 复制代码
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<optional>true</optional>
</dependency>

3.2 输出⽇志

4. 总结

  1. ⽇志是程序中的重要组成部分,使⽤⽇志可以快速的发现和定位问题,Spring Boot 内容了⽇志框架,默认情况下使⽤的是 info ⽇志级别将⽇志输出到控制台的,我们可以通过 lombok 提供的@Slf4j 注解和 log 对象快速的打印⾃定义⽇志.
  2. ⽇志包含 6 个级别, ⽇志级别越⾼,收到的⽇志信息也就越少,我们可以通过配置⽇志的保存名称或保存⽬录来将⽇志持久化.
相关推荐
ChinaRainbowSea3 分钟前
补充:问题:CORS ,前后端访问跨域问题
java·spring boot·后端·spring
hqxstudying2 小时前
java依赖注入方法
java·spring·log4j·ioc·依赖
春生野草2 小时前
关于SpringMVC的整理
spring
Bug退退退1233 小时前
RabbitMQ 高级特性之重试机制
java·分布式·spring·rabbitmq
全栈凯哥3 小时前
02.SpringBoot常用Utils工具类详解
java·spring boot·后端
hello早上好4 小时前
CGLIB代理核心原理
java·spring
RainbowSea6 小时前
跨域问题(Allow CORS)解决(3 种方法)
java·spring boot·后端
RainbowSea6 小时前
问题 1:MyBatis-plus-3.5.9 的分页功能修复
java·spring boot·mybatis
sniper_fandc7 小时前
SpringBoot系列—入门
java·spring boot·后端
先睡10 小时前
Redis的缓存击穿和缓存雪崩
redis·spring·缓存