【Spring Boot】(三)深入理解 Spring Boot 日志

文章目录

  • 前言
  • 一、日志文件的作用
  • 二、Spring Boot 中的日志
    • 2.1 查看输出的日志信息
    • 2.2 日志格式
    • 二、Spring Boot 中的日志
      • 2.1 查看输出的日志信息
      • 2.2 日志格式
  • 三、自定义日志输出
    • 3.1 日志框架
    • 3.2 日志对象的获取
    • 3.3 使用日志对象打印日志
  • 四、日志级别
    • 4.1 日志级别的作用
    • 4.2 日志级别的分类
    • 4.3 通过配置文件设置日志级别
  • 五、日志持久化
  • 五、日志持久化
    • 5.1 日志输出到文件
    • 5.2 日志输出到数据库
  • 六、使用 Lombok 实现更简单的日志输出
    • 6.1 通过 EditStarts 插件添加 Lombok 依赖
    • 6.2 输出日志


前言

在现代软件开发中,日志是一项至关重要的工具,它记录了应用程序运行过程中的关键信息,当程序运行出现错误的时候,可以帮助开发人员快速识别和解决存在的问题。通过合理的日志记录,能够帮助我们更好地了解应用程序的运行情况,从而提高应用程序的稳定性和可维护性。

本文的主要内容就是深入探讨日志在 Spring Boot 项目中的使用。主要介绍了日志的类型、自定义日志的定义,日志等级以及对输出日志的持久化。此外,还包括使用 Lombok 更简单高效的去输出日志信息。

一、日志文件的作用

日志文件在软件开发和运维中起着至关重要的作用,它记录了系统、应用程序或服务在运行过程中所产生的各种事件、状态和错误信息。日志文件的作用如下

  1. 故障排查与问题定位:日志文件是排查故障和定位问题的重要工具。当系统或应用程序出现异常、错误或崩溃时,日志文件中记录的详细信息可以帮助开发人员或运维人员追踪问题的来源,并帮助快速定位和解决问题。

  2. 性能分析与优化:通过分析日志文件,可以了解系统或应用程序的性能表现。识别瓶颈、耗时操作和资源消耗,从而进行优化和改进,提高系统的响应速度和性能。

  3. 监控与预警:监控日志文件可以实时监测系统运行状态。通过设置特定的日志规则和报警机制,可以在系统发生异常或特定事件发生时,及时通知相关人员进行处理。

  4. 安全审计与合规性:日志文件记录了系统的行为和操作,可用于安全审计和合规性检查。这对于满足安全标准和法规要求,以及保护敏感信息非常重要。

  5. 数据备份与还原:日志文件记录了系统的历史状态和操作,可以用于数据备份和还原,恢复到特定时间点的状态。

  6. 追溯历史记录:日志文件是系统运行过程中的重要历史记录,对于了解系统使用情况、用户行为和交互过程等具有重要价值。

总体而言,日志文件是系统运行和维护的重要工具,能够提供丰富的信息和数据,帮助开发人员、运维人员和管理员监控和维护系统的健康运行,及时发现和解决问题,优化系统性能,并满足安全和合规性要求。因此,良好的日志记录和管理是一个高质量的软件和系统的重要组成部分。

二、Spring Boot 中的日志

Spring Boot 提供了强大的日志功能,可以方便地查看输出的日志信息并灵活配置日志格式。

2.1 查看输出的日志信息

Spring Boot 默认使用 Logback 作为日志框架,可以将日志输出到控制台(Console)和日志文件中。在开发和调试过程中,我们可以直接查看控制台上输出的日志信息。

例如,启动 Spring Boot 项目时输出的日志信息:


以上日志信息包含了时间戳、日志级别、进程 ID、线程信息、类名和日志内容等。不同的日志级别对应不同的颜色,如 INFO 是绿色,WARN 是黄色,ERROR 是红色,便于区分日志的严重程度。

2.2 日志格式

二、Spring Boot 中的日志

Spring Boot 提供了强大的日志功能,可以方便地查看输出的日志信息并灵活配置日志格式。下面将介绍如何查看输出的日志信息以及日志的格式配置。

2.1 查看输出的日志信息

Spring Boot 默认使用 Logback 作为日志框架,可以将日志输出到控制台(Console)和日志文件中。在开发和调试过程中,我们可以直接查看控制台上输出的日志信息。

例如,我们可以在 Spring Boot 应用程序的控制台输出中,看到类似以下的日志信息:

2023-08-06 15:30:00.123  INFO 12345 --- [main] com.example.Application : Starting Application on localhost with PID 12345 (D:\workspace\project\target\classes started by user in D:\workspace\project)
2023-08-06 15:30:00.456  INFO 12345 --- [main] com.example.Application : Started Application in 2.345 seconds (JVM running for 3.456)

以上日志信息包含了时间戳、日志级别、进程 ID、线程信息、类名和日志内容等。不同的日志级别对应不同的颜色,如 INFO 是绿色,WARN 是黄色,ERROR 是红色,便于区分日志的严重程度。

2.2 日志格式

Spring Boot 允许我们对日志的输出格式进行灵活配置。日志的格式配置通常通过在 application.ymlapplication.properties 中添加相应的配置来实现。

例如,我们可以在 application.yml 中添加如下配置:

logging:
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} : %msg%n"
    file: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} : %msg%n"

以上配置分别设置了控制台输出和日志文件输出的日志格式。%d 表示时间戳,%thread 表示线程信息,%-5level 表示日志级别(左对齐,占5个字符宽度),%logger{36} 表示类名(只显示类名的后36个字符,防止类名过长),%msg 表示日志内容,%n 表示换行。

通过配置不同的日志格式,我们可以自定义日志的输出内容和样式,满足不同的需求。

需要注意的是,日志配置不仅限于上述两种输出格式,Spring Boot 还支持更多的日志配置选项,如日志文件路径、日志滚动策略、日志级别等。可以根据实际需求,在 application.ymlapplication.properties 中添加对应的日志配置,以满足不同的日志输出和管理需求。

三、自定义日志输出

在 Spring Boot 中,我们可以自定义日志输出,包括选择不同的日志框架、获取日志对象并使用日志对象打印日志。下面分别介绍这三个方面。

3.1 日志框架

日志门面(Logging Facades)和日志实现是 Java 应用中常用的两种日志相关的组件

  • 日志门面是一种接口或抽象层,提供了统一的日志接口,允许应用程序使用统一的方式记录日志,而不依赖于特定的日志实现。
  • 而日志实现则是具体的日志框架,实现了日志门面定义的接口,并负责将日志信息输出到相应的目的地,如控制台或日志文件。

在 Java 生态系统中,有多个日志门面和日志实现可供选择。其中,常见的日志门面有 commons-loggingSLF4J,常见的日志实现有 log4j 1/2JUL(Java Util Logging)以及 logback

  1. Commons-Logging:是 Apache Commons Logging 组件,是 JDK 日志的一个简单封装。它为开发者提供了一种统一的接口来记录日志,可以透明地切换不同的日志实现,但在实际使用中并不常见,因为它的功能较为有限且发展相对较早。

  2. SLF4J(Simple Logging Facade for Java):是目前较为广泛使用的日志门面。它提供了一套简单的抽象接口,使开发者能够以统一的方式记录日志。与 Commons-Logging 不同,SLF4J 设计更为优雅且功能更全面,它成为了许多 Java 应用的首选日志门面

在选择日志门面后,我们需要选择相应的日志实现来实际输出日志信息。常见的日志实现有:

  1. Log4j 1:是 Apache Log4j 1.x 版本,是较早的日志实现,功能强大且配置灵活。不过由于版本较旧,有些特性在现代的应用中可能显得有些过时。

  2. Log4j 2:是 Apache Log4j 2.x 版本,是 Log4j 1 的升级版,拥有更多的功能和性能优化。Log4j 2 同时支持 SLF4J,因此可以无缝地与 SLF4J 集成。

  3. JUL(Java Util Logging):是 JDK 自带的日志实现,相对简单,无需额外依赖,但功能较为有限。由于不需要额外的库,有些 Java 库和框架会使用 JUL 作为默认日志实现。

  4. Logback:是由 Log4j 1 的原始作者设计的日志实现,旨在替代 Log4jLogback 是性能优越且功能强大的日志框架,与 SLF4J 高度集成,因此在配合 SLF4J 使用时效果非常好。

在选择日志框架时,推荐使用 SLF4J 作为日志门面,并结合相应的日志实现,如 LogbackLog4j 2。这样可以保持日志输出的灵活性,并且能够在不改变应用代码的情况下切换到其他的日志实现,同时兼顾性能和功能的需求。

3.2 日志对象的获取

在 Spring Boot 组件类中,我们可以使用 LoggerFactory 类的静态方法 getLogger(Class) 来获取日志对象。通常,我们会将日志对象作为类的成员变量,以便在类的各个方法中使用。

@RestController
public class LoggerController {
    private Logger logger = LoggerFactory.getLogger(LoggerController.class);
    
    @RequestMapping("/log")
    public void logging(){
        logger.trace("i am trace");
        logger.debug("i am debug");
        logger.info("i am info");
        logger.warn("i am warn");
        logger.error("i am error");
    }
}

3.3 使用日志对象打印日志

运行启动类,然后在浏览器中输入localhost:8080/log 触发日志信息的打印:


此时就能够在控制台看到打印出的日志信息,但是我们发现只打印了INFOWARNERROR这三个日志,而 TRACEDEBUG 却没有打印,其原因和日志的级别有关。

四、日志级别

日志级别是指日志信息的重要程度或严重程度,不同级别的日志信息对应不同的事件和状态。在 Spring Boot 中,日志级别用于控制日志输出的详细程度,可以通过设置不同的日志级别来控制哪些日志信息会被记录和输出,从而灵活地控制日志的量和内容

由于 Spring Boot 默认输出的日志级别是 INFO,因此只能看到INFO及更高基本的日志信息。

4.1 日志级别的作用

  • 日志级别的作用在于帮助开发人员在不同的场景下过滤和定位日志信息。通过设置适当的日志级别,可以在开发阶段记录较为详细的日志信息,帮助调试和排查问题;

  • 在生产环境中,可以设置较低的日志级别,只记录重要的信息,避免过多的日志输出对系统性能造成影响

4.2 日志级别的分类

常见的日志级别(从低到高)包括:

  1. TRACE(最低级别):最详细的日志信息,用于追踪程序的运行过程,通常在开发和调试阶段使用。

  2. DEBUG:调试级别的日志信息,用于输出调试相关的信息,便于排查问题。

  3. INFO:一般的信息级别,用于输出程序运行状态的一般信息。

  4. WARN:警告级别,用于记录可能会导致问题的情况,但不影响程序正常运行。

  5. ERROR:错误级别,用于记录错误信息,表示程序发生了错误。

  6. FATAL(最高级别):最严重的错误级别,用于记录致命错误,表示程序无法继续运行。


日志级别可以按照从低到高的顺序分为两类:

  1. 调试级别:包括 TRACEDEBUG,用于输出程序运行过程中的详细信息,通常在开发和调试阶段使用。

  2. 运行级别:包括 INFOWARNERRORFATAL,用于输出程序运行状态和潜在问题,可以在生产环境中使用。

4.3 通过配置文件设置日志级别

在 Spring Boot 中,可以通过配置文件来设置日志级别。默认情况下,Spring Boot 使用 application.ymlapplication.properties 中的配置来控制日志级别。

以下是在 application.yml 中设置日志级别的示例:

logging:
  level:
    root: INFO  # 根日志级别为 INFO,即默认情况下的日志级别
    com:
      example:
        controller: DEBUG  # com.example.controller 包及其子包的日志级别为 DEBUG
        component: ERROR  # com.example.component 包及其子包的日志级别为 ERROR

在上述示例中,我们设置了三个不同包的日志级别:根日志级别为 INFOcom.example.controller 包及其子包的日志级别为 DEBUGcom.example.component 包及其子包的日志级别为 ERROR

通过设置不同的日志级别,可以在不同的场景下灵活控制日志输出的详细程度,帮助开发人员更好地调试和监控应用程序。

五、日志持久化

五、日志持久化

在应用程序运行期间,产生的日志信息通常需要进行持久化,以便后续的日志审计、问题排查和性能分析等目的。日志持久化是将日志信息保存到持久化存储介质,如日志文件、数据库或远程日志服务器等的过程。在 Spring Boot 中,常见的日志持久化方式包括:

5.1 日志输出到文件

Spring Boot 默认情况下会将日志输出到控制台(Console),但通常为了更好地管理和维护日志,我们希望将日志输出到文件。通过在 application.ymlapplication.properties 中添加相应的配置,可以将日志输出到文件。

例如,在 application.yml 中添加以下配置:

logging:
  file:
    name: myapp.log  # 设置日志文件的名称,可以是任意文件名

上述配置将会将日志以追加的方式输出到名为 myapp.log 的文件中。日志文件会被保存在应用程序的工作目录下,通常是项目的根目录

5.2 日志输出到数据库

有时候,我们希望将日志信息存储到数据库中,以便更方便地查询和分析。Spring Boot 可以通过日志框架来实现将日志输出到数据库的功能。

首先,我们需要创建一个用于保存日志信息的数据库表。可以根据实际需求设计数据库表结构,例如,包括日志级别、时间戳、日志内容、类名、方法名等字段。

然后,我们可以使用合适的日志框架来配置将日志信息输出到数据库。对于 Logback,可以使用其提供的 DBAppender 来实现日志输出到数据库。

六、使用 Lombok 实现更简单的日志输出

Lombok 是一款Java库,它通过注解自动为Java类生成一些通用的代码,从而简化了Java开发过程。在日志输出方面,Lombok可以帮助我们更方便地使用日志对象,避免了手动定义日志变量的繁琐过程。

6.1 通过 EditStarts 插件添加 Lombok 依赖

首先,我们需要在项目的构建文件(如pom.xml)中添加 Lombok 依赖,以便在项目中使用 Lombok。如果 Spring Boot 项目在创建的时候没有勾选 Lombok 依赖,则可以通过 IDEA 中的 EditStarts 插件添加 Lombok 依赖:

  1. 安装 EditStarts 插件


2. 在 pom.xml 文件中点击右键选择 Generate


3. 选择 Edit Starters,如果没有则说明没有安装成功。


4. 点击后出现如下界面,点击 OK


5. 然后出现以下界面,在 Search 中搜索需要的依赖添加即可。

6.2 输出日志

使用 Lombok 来简化日志输出非常简单。我们只需要在类上添加 @Slf4j 注解,Lombok 就会自动为我们生成一个名为 log 的日志对象。

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class LoggerController {

    @RequestMapping("/log")
    public void logging(){
        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");
    }
}

在上述示例中,我们使用 @Slf4j 注解在类上,Lombok 会为 LoggerController 类生成一个名为 log 的日志对象。之后我们就可以直接使用 log 对象来输出不同级别的日志信息,而不需要手动定义日志对象。

通过 Lombok 的简化,我们可以更加便捷地实现日志输出,避免了手动定义日志对象和导入日志框架包的麻烦,提高了代码的可读性和简洁性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/63667.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot配置文件的使用

目录 1.application.properties是springboot默认的配置文件,但是比较繁琐,一般用.yml文件 2. 配置文件的作用 3.配置文件的使用 1.application.properties是springboot默认的配置文件,但是比较繁琐,一般用.yml文件 ①、properti…

我在leetcode用动态规划炒股

事情是这样的,突然兴起的我在letcode刷题 121. 买卖股票的最佳时机122. 买卖股票的最佳时机 II123. 买卖股票的最佳时机 III 以上三题。 1. 121. 买卖股票的最佳时机 1.1. 暴力遍历,两次遍历 1.1.1. 算法代码 public class Solution {public int Ma…

webpack基础知识八:说说如何借助webpack来优化前端性能?

一、背景 随着前端的项目逐渐扩大,必然会带来的一个问题就是性能 尤其在大型复杂的项目中,前端业务可能因为一个小小的数据依赖,导致整个页面卡顿甚至奔溃 一般项目在完成后,会通过webpack进行打包,利用webpack对前…

使用事件侦听器和 MATLAB GUI 查看 Simulink 信号研究

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Linux(三):Linux服务器下日常实操命令 (常年更新)

基础命令 cd命令:切换目录 cd :切换当前目录百至其它目录,比如进入/etc目录,则执行 cd /etccd / :在Linux 系统中斜杠“/”表示的是根目录。cd / ,即进入根目录.cd ~:进入用户在该系统的home目录&#…

Linux——设备树

目录 一、Linux 设备树的由来 二、Linux设备树的目的 1.平台识别 2.实时配置 3.设备植入 三、Linux 设备树的使用 1.基本数据格式 2.设备树实例解析 四、使用设备树的LED 驱动 五、习题 一、Linux 设备树的由来 在 Linux 内核源码的ARM 体系结构引入设备树之前&#x…

【CSS】圆形放大的hover效果

效果 index.html <!DOCTYPE html> <html><head><title> Document </title><link type"text/css" rel"styleSheet" href"index.css" /></head><body><div class"avatar"></…

机器学习常用Python库安装

机器学习常用Python库安装 作者日期版本说明Dog Tao2022.06.16V1.0开始建立文档 文章目录 机器学习常用Python库安装Anaconda简介使用镜像源配置 Pip简介镜像源配置 CUDAPytorch安装旧版本 TensorFlowGPU支持说明 DGL简介安装DGLLife RDKitscikit-multilearn Anaconda 简介 …

英语使用场景口语

HOTEL ENGLISH hotel motel inn b&b Process 1.booking a room can i reserve a room? reservation do you have and singles? double room standard room deluxe room presidential suite do you have a pick-up service? 2.checking in where is the recept…

MySQL的数据插入总结(不存在就插入,存在就更新)

MySQL的数据插入总结(不存在就插入&#xff0c;存在就更新) 1. on duplicate key update 当在insert语句后面带上ON DUPLICATE KEY UPDATE 子句&#xff0c;而要插入的行与表中现有记录的惟一索引或主键中产生重复值&#xff0c;那么就会发生旧行的更新&#xff1b;如果插入的…

AI 绘画Stable Diffusion 研究(五)sd文生图功能详解(下)

大家好&#xff0c;我是风雨无阻。 上一篇文章详细介绍了sd文生图的功能及使用注意事项&#xff0c;感兴趣的朋友可以前往查看&#xff1a;AI 绘画Stable Diffusion 研究&#xff08;四&#xff09;sd文生图功能详解&#xff08;上&#xff09; 。 那今天这篇文章&#xff0c;我…

sigmoid ReLU 等激活函数总结

sigmoid ReLU sigoid和ReLU对比 1.sigmoid有梯度消失问题&#xff1a;当sigmoid的输出非常接近0或者1时&#xff0c;区域的梯度几乎为0&#xff0c;而ReLU在正区间的梯度总为1。如果Sigmoid没有正确初始化&#xff0c;它可能在正区间得到几乎为0的梯度。使模型无法有效训练。 …

【Github】Uptime Kuma:自托管监控工具的完美选择

简介&#xff1a; Uptime Kuma 是一款强大的自托管监控工具&#xff0c;通过简单的部署和配置&#xff0c;可以帮助你监控服务器、VPS 和其他网络服务的在线状态。相比于其他类似工具&#xff0c;Uptime Kuma 提供更多的灵活性和自由度。本文将介绍 Uptime Kuma 的功能、如何使…

C#--设计模式之单例模式

单例模式大概是所有设计模式中最简单的一种&#xff0c;如果在面试时被问及熟悉哪些设计模式&#xff0c;你可能第一个答的就是单例模式。 单例模式的实现分为两种&#xff1a; 饿汉式&#xff1a;在静态构造函数执行时就立即实例化。懒汉式&#xff1a;在程序执行过程中第一…

C++类的定义和对象的创建

一、问题引入 C类和对象到底是什么意思&#xff1f; 1、C 中的类&#xff08;Class&#xff09;可以看做C语言中结构体&#xff08;Struct&#xff09;的升级版。结构体是一种构造类型&#xff0c;可以包含若干成员变量&#xff0c;每个成员变量的类型可以不同&#xff1b; …

K8s的高可用搭建

高可用技术搭建 在master节点上需要部署&#xff1a;keepalived、haproxy

Linux 信号signal处理机制

Signal机制在Linux中是一个非常常用的进程间通信机制&#xff0c;很多人在使用的时候不会考虑该机制是具体如何实现的。signal机制可以被理解成进程的软中断&#xff0c;因此&#xff0c;在实时性方面还是相对比较高的。Linux中signal机制的模型可以采用下图进行描述。 每个进程…

openGauss学习笔记-33 openGauss 高级数据管理-视图

文章目录 openGauss学习笔记-33 openGauss 高级数据管理-视图33.1 语法格式33.2 参数说明33.3 示例 openGauss学习笔记-33 openGauss 高级数据管理-视图 视图与基本表不同&#xff0c;是一个虚拟的表。数据库中仅存放视图的定义&#xff0c;而不存放视图对应的数据&#xff0c…

Misc取证学习

文章目录 Misc取证学习磁盘取证工具veracryto挂载fat文件DiskGenius 磁盘取证例题[RCTF2019]disk 磁盘[](https://ciphersaw.me/ctf-wiki/misc/disk-memory/introduction/#_2)内存取证工具volatility 内存取证例题数字取证赛题0x01.从内存中获取到用户admin的密码并且破解密码 …

Maven: ‘mvn‘ is not recognized as an internal or external command

下载并配置好Maven之后&#xff0c;CMD测试安装是否成功&#xff1a;mvn -v 提示&#xff1a; mvn is not recognized as an internal or external command, operable program or batch file. 检查环境变量&#xff1a; MAVEN_HOME: %MAVEN_HOME%\bin: 看上去没问题&#x…
最新文章