• 2023.11.17 关于 Spring Boot 日志文件


    目录

    日志文件作用

    常见的日志框架说明 

    门面模式

    日志的使用

    日志的级别

    六种级别

    日志级别的设置

    日志的持久化

    使用 Lombok 输出日志

    实现原理

    普通打印和日志的区别


    日志文件作用

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

    常见的日志框架说明 

    门面模式

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

    简单理解

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

    导致问题

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

    解决方法

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

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

    日志的使用

    得到日志对象

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

    注意:

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


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

    1. import org.slf4j.Logger;
    2. import org.slf4j.LoggerFactory;
    3. import org.springframework.stereotype.Controller;
    4. import org.springframework.web.bind.annotation.RequestMapping;
    5. import org.springframework.web.bind.annotation.ResponseBody;
    6. @Controller
    7. @ResponseBody // 加在类上,表示当前类中的所有方法返回的都是非静态页面的数据
    8. @RequestMapping("/test") // = @WebServlet("/url")
    9. public class TestController {
    10. // 1.得到日志对象
    11. private static final Logger log = LoggerFactory.getLogger(TestController.class);
    12. @RequestMapping("/say-hi") // = @WebServlet("/url")
    13. public String sayHi() {
    14. // 2.打印日志
    15. log.trace("i am trace");
    16. log.debug("i am debug");
    17. log.info("i am info");
    18. log.warn("i am warn");
    19. log.error("i am error");
    20. return "hello world ";
    21. }
    22. }

    运行结果:

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

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

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

    日志的级别


    六种级别

    trace

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

    debug

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

    info

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

    warn

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

    error

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

    fatal

    • 致命的,因为代码异常导致程序退出执行的事件

    日志级别的设置

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

    运行结果:

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

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

    运行结果:

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

    日志的持久化

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

    两种方式

    指定日志的存储目录

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

    指定日志文件的文件名

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

    注意点一:

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

    注意点二:

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

    使用 Lombok 输出日志

    实例理解

    • 我们在 EasyController 类上加 @Slfj 注解
    • 即可直接在该类中使用 log 对象
    1. import lombok.extern.slf4j.Slf4j;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import org.springframework.web.bind.annotation.ResponseBody;
    5. @Controller
    6. @ResponseBody
    7. @Slf4j
    8. public class EasyController {
    9. @RequestMapping("/test/easy")
    10. public void sayHi() {
    11. log.error("i am error");
    12. }
    13. }

    实现原理

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

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

    普通打印和日志的区别

    最关键的两个区别

    • 普通打印 没有级别的控制,无法进行信息的筛选
    • 普通打印  不支持持久化,无法保存下来
  • 相关阅读:
    C++学习笔记
    Vue 消息的订阅与发布
    动漫制作技巧如何制作动漫视频
    (附源码)python电影院信息管理系统 毕业设计 021844
    关于对Java中volatile关键字的理解与简述
    ArmSoM-RK3588编解码之mpp编码demo解析:mpi_enc_test
    一文读懂PostgreSQL中的索引
    YAGEO(国巨)旧电脑风扇制作风力发电机步骤详解 - 电动机控制电路图
    iOS16更新后打不开微信 解决办法来了
    PyTorch学习笔记-神经网络模型搭建小实战
  • 原文地址:https://blog.csdn.net/weixin_63888301/article/details/134471892