2023.11.17 关于 Spring Boot 日志文件

本文介绍了日志文件的作用,常见日志框架如Log4j、JUL、Logback和Slf4j-Simple的区别,以及如何通过门面模式降低日志框架的耦合。重点讲解了在SpringBoot中使用Lombok简化日志操作和设置日志级别,以及日志的持久化和配置技巧。
摘要由CSDN通过智能技术生成

目录

日志文件作用

常见的日志框架说明 

门面模式

日志的使用

得到日志对象

使用日志对象提供的方法打印日志

日志的级别

六种级别

日志级别的设置

日志的持久化

指定日志的存储目录

指定日志文件的文件名

使用 Lombok 输出日志

实现原理

普通打印和日志的区别


日志文件作用

  • 记录 错误日志 和 警告日志(发现和定位问题)
  • 记录 用户登录日志,分析用户是否正常登录
  • 记录 系统操作日志,方便 数据恢复 和 定位操作人
  • 记录程序执行时间,方便以后为优化程序提供数序支持

常见的日志框架说明 

门面模式

  • 设计模式的一种
  • 门面模式就是一种通过引入一个简化接口来隐藏复杂细系统的设计模式,它提供了一种简单的方式让客户端与系统进行交互,同时降低了客户端和系统之间的耦合度

简单理解

  • 日志系统有多个,即多个不同的框架,框架的本质是多个工具类的集合
  • 不同的框架有着不同的类名,不同的类名也有着不同的方法名
  • 所以 Log4j、JUL、Logback、Slf4j-Simple 这些日志系统的写法完全一点边都不沾

导致问题

  • 如果此时直接在应用程序中以 Log4j 日志系统为基本进行日志操作
  • 有一天 Log4j 日志系统 出现了严重 bug,需要将该应用程序的 日志系统 改为 Logback 时
  • 因为这两个日志系统的写法完全一点边不沾,所以此时应用程序中需要修改代码就会很多很多

解决方法

  • 引入日志门面
  • 我们按照 日志门面 所提供的写法来写日志操作代码
  • 然后 日志门面 会根据程序员的配置 和 程序员引入的驱动 来操作最底层的日志系统
  • 通过该方式便可轻松切换日志系统
  • 从而很大程度上降低了应用程序和日志系统的耦合度

  • Spring Boot 内置的日志门面是 Slf4j 、日志系统是 Logback

日志的使用

得到日志对象

  • 在 TestController 类中使用日志工厂 LoggerFactory 获取日志对象
  • 日志在程序运行期间只加载一次,并且不可变,所以使用 static 和 final 修饰
//    1.得到日志对象
    private static final Logger log = LoggerFactory.getLogger(TestController.class);

注意:

  • Logger 有很多一定要选择导入下图红框的包


使用日志对象提供的方法打印日志

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@ResponseBody // 加在类上,表示当前类中的所有方法返回的都是非静态页面的数据
@RequestMapping("/test") // = @WebServlet("/url")
public class TestController {
//    1.得到日志对象
    private static final Logger log = LoggerFactory.getLogger(TestController.class);

    @RequestMapping("/say-hi") // = @WebServlet("/url")
    public String sayHi() {
//        2.打印日志
        log.trace("i am trace");
        log.debug("i am debug");
        log.info("i am info");
        log.warn("i am warn");
        log.error("i am error");
        return "hello world ";
    }
}

运行结果:

  • 先在浏览器中访问下图路径

  • 再观察控制台输出的日志信息

  • 我们自定义打印的日志信息有五条
  • 在上图运行结果中,控制台却仅打印了后三条日志信息
  • 因为此时 Spring Boot 默认打印的日志级别为 info 级别
  • 即 大于或等于 info 级别的日志信息才会打印出来

日志的级别


六种级别

trace

  • 微量,少许的意思级别最低

debug

  • 需要调试的时候的关键信息打印

info

  • 普通的打印信息,默认日志级别

warn

  • 警告,不影响使用,但需要注意的问题

error

  • 错误信息,级别较高的错误日志信息

fatal

  • 致命的,因为代码异常导致程序退出执行的事件
  • fatal 级别无法进行相应操作

日志级别的设置

  • 日志输出的默认级别是 info
  • 我们可以在配置文件中手动配置默认日志输出级别
  • 在配置文件 application.yml 中,加入下段配置代码即可
logging:
  level:
    root: warn
  • 上述配置代码的作用域为根目录(root)下的所有包
  • 表示设置根日志记录器的级别为 warn
  • 这意味着,应用程序中所有的日志记录器都将继承这个级别
  • 除非它们已经被明确地设置了其他级别

运行结果:

  • 如果我们想设置指定某一包下的日志输出级别
  • 可按下图方式添加配置代码

  • 红框路径以 java 目录为起始目录

运行结果:

  • 明确指定某一包下的日志输出级别的优先级高于 使用 root 指定根目录下所有包的日志输出级别

日志的持久化

  • 上述日志的仅在控制台输出
  • 在生产环境中我们需要将日志保存下来
  • 以便出现问题后可以追溯问题

指定日志的存储目录

  • 启动 Spring Boot 后
  • 在 E盘的 test 目录下的 testDemo 目录下会出现日志文件
  • 如果启动前无该路径,启动后便会自动创建出该路径
logging:
  file:
    path: E://test//testDemo

指定日志文件的文件名

  • 启动 Spring Boot 后
  • 会在指定目录下生产一个名为 spring-log.log 的日志文件
logging:
  file:
    name: E://test//testDemo//spring-log.log

注意一:

  • 保存日志的路径不要放在系统盘(C 盘)
  • 路径中不要出现中文和空格

注意二:

  • 在 Spring Boot 中进行日志记录时
  • 如果没有指定日志文件的名称 或 两次保存的日志指定了相同的文件名
  • 那么第二次运行 Spring Boot 时,其保存的日志信息会被追加到第一次保存的日志文件后面,而不是覆盖第一次保存的日志信息
  • 因为 Spring Boot 的日志系统默认是以 追加模式 来写入日志的
  • 也就是说每次写入日志时,都会在原有日志的基础上添加新的日志信息,而不会删除或覆盖原有的日志

注意三:

  • 日志文件的大小通常会有一个上限
  • 这是为了防止日志文件过大导致加载速度变慢
  • 当日志文件达到一定大小后,Spring Boot 会自动创建一个新的日志文件
  • 以防止单个日志文件过大
  • Spring Boot 中日志文件默认大小是 10MB
  • 但我们可以通过下段配置代码,实现手动配置日志文件的大小上限
logging:
  file:
    path: E://test//testDemo//spring-log.log
    max-size: 8MB
  • 该段配置代码将日志文件的大小上限设置为 8MB

阅读下面内容之前 建议点击下方链接了解和添加 Lombok 依赖

IDEA 配置 Lombok


使用 Lombok 输出日志

实例理解

  • 我们在 EasyController 类上加 @Slfj 注解
  • 即可直接在该类中使用 log 对象
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@ResponseBody
@Slf4j
public class EasyController {
    @RequestMapping("/test/easy")
    public void sayHi() {
        log.error("i am error");
    }
}

实现原理

  • Java 程序在 IDEA 中执行完后会生产一个 target 文件
  • 该文件为源代码完成去掉注释等一系列工作后的文件
  • 且该文件就是该项目执行的最终代码

  • 我们发现 Lombok 的实现原理就是在编译阶段加上了我们原本需要的代码

普通打印和日志的区别

最关键的两个区别

  • 普通打印 没有级别的控制,无法进行信息的筛选
  • 普通打印  不支持持久化,无法保存下来
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茂大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值