【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 包及其子包的日志级别为 DEBUGcomponent: 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.rhkb.cn/news/79777.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle-expdp报错ORA-39077、06502(Bug-16928674)

问题: 用户在使用expdp进程导出时,出现队列报错ORA-39077、ORA-06502 ORA-31626: job does not exist ORA-31638: cannot attach to job SYS_EXPORT_SCHEMA_01 for user SYS ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95 ORA-06512: at "SYS.KUPV$…

【修正-高斯拉普拉斯滤波器-用于平滑和去噪】基于修正高斯滤波拉普拉斯地震到达时间自动检测研究(Matlab代码实现)

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

解密HTTP代理爬虫中的IP代理选择与管理策略

在当今数据驱动的世界中,HTTP代理爬虫作为一项重要的数据采集工具,其成功与否往往取决于IP代理的选择与管理策略。作为一家专业的HTTP代理产品供应商,我们深知IP代理在数据采集中的重要性。在本文中,我们将分享一些关于HTTP代理爬…

图像膨胀+滤波达到边缘外扩模糊效果

有一个扯淡需求, 根据某些格网值渲染对应的颜色, 我们做的实现方案是按照色代码渐变做颜色映射, 但是某些厂家不顾结果正确性与否, 应是为了好看做的好看, 将边界膨胀模糊, 一个非风场,力场类似场数据做了一个类似场的渲染效果, 也不知道说啥好, 例如原始图渲染如下 经过一系列…

Spring Boot配置文件与日志文件

1. Spring Boot 配置文件 我们知道, 当我们创建一个Spring Boot项目之后, 就已经有了配置文件存在于目录结构中. 1. 配置文件作用 整个项目中所有重要的数据都是在配置文件中配置的,比如: 数据库的连接信息 (包含用户名和密码的设置) ;项目的启动端口;第三方系统的调…

资深测试总结,Web自动化测试POM设计模式封装框架,看这篇就够了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 线性脚本 import…

ParallelCollectionRDD [0] isEmpty at KyuubiSparkUtil.scala:48问题解决

ParallelCollectionRDD [0] isEmpty at KyuubiSparkUtil.scala:48问题解决 这个问题出现在使用Kyubi Spark Util处理ParallelCollectionRDD的过程中,具体是在KyubiSparkUtil.scala文件的第48行调用isEmpty方法时出现的。该问题可能是由以下几个原因引起的&#xff1…

FFmpeg将编码后数据保存成mp4

以下测试代码实现的功能是:持续从内存块中获取原始数据,然后依次进行解码、编码、最后保存成mp4视频文件。 可保存成单个视频文件,也可指定每个视频文件的总帧数,保存多个视频文件。 为了便于查看和修改,这里将可独立的…

[CKA]考试之检查可用节点数量

由于最新的CKA考试改版,不允许存储书签,本博客致力怎么一步步从官网把答案找到,如何修改把题做对,下面开始我们的 CKA之旅 题目为: Task 检查集群中有多少节点为Ready状态(不包括被打上 Taint&#xff1…

FPGA学习——Altera IP核调用之PLL篇

文章目录 一、IP核1.1 IP核简介1.2 FPGA中IP核的分类1.3 IP核的缺陷 二、PLL简介2.1 什么是PLL2.2 PLL结构图2.3 C4开发板上PLL的位置 三、IP核调用步骤四、编写测试代码五、总结 一、IP核 1.1 IP核简介 IP核(知识产权核),是在集成电路的可…

视频监控汇聚平台EasyCVR视频分享页面WebRTC流地址播放不了是什么原因?

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多…

机器学习笔记之优化算法(八)简单认识Wolfe Condition的收敛性证明

机器学习笔记之优化算法——简单认识Wolfe Condition收敛性证明 引言回顾: Wolfe \text{Wolfe} Wolfe准则准备工作推导条件介绍推导结论介绍 关于 Wolfe \text{Wolfe} Wolfe准则收敛性证明的推导过程 引言 上一节介绍了非精确搜索方法—— Wolfe \text{Wolfe} Wolf…

【Python】从同步到异步多核:测试桩性能优化,加速应用的开发和验证

目录 测试工作中常用到的测试桩mock能力 应用场景 简单测试桩 http.server扩展:一行命令实现一个静态文件服务器 性能优化:使用异步响应 异步响应 能优化:利用多核 gunicorn 安装 gunicorn 使用 gunicorn 启动服务 性能优化&#…

linuxARM裸机学习笔记(2)----汇编LED灯实验

MX6ULL 的 IO IO的复用功能 这里的只使用了低五位,用来配置io口,其中bit0~bit3(MUX_MODE)就是设置 GPIO1_IO00 的复用功能的,GPIO1_IO00 一共可以复用为 9种功能 IO,分别对应 ALT0~ALT8。每种对应了不同的功能 io的属性配置 HY…

MATLAB(R2023a)添加工具箱TooLbox的方法-以GPOPS为例

一、找到工具箱存放位置 首先我们需要找到工具箱的存放位置,点击这个设置路径可以看到 我们的matlab工具箱的存放位置 C:\Program Files\MATLAB\R2023a\toolbox\matlab 从资源管理器中打开这个位置,可以看到里面各种工具箱 二、放入工具箱 解压我们…

【docker】docker私有仓库

目录 一、说明二、私有仓库搭建三、上传镜像到私有仓库四、从私有仓库拉取镜像 一、说明 1.docker官方的docker hub(https://hub.docker.com)是一个用于管理公共镜像的仓库,可以从上面拉取镜像到本地,也可以把自己的镜像推送上去 2.若服务器无法访问互联…

FreeRTOS(vTaskList与vTaskGetRunTimeStats)

目录 1、Cube配置 ①配置SYS ②配置TIM3 ③配置USART2 ④配置FreeRTOS ⑤配置中断优先级 2、代码添加改动 ①在main函数合适位置开启TIM3中断 ②修改HAL_TIM_PeriodElapsedCallback函数 ③完善两个相关函数 ④vTaskList与vTaskGetRunTimeStats的使用 vTaskList&#xff…

关于多媒体视频翻译,你了解多少?

近年来,随着多媒体视频行业的快速发展,观看中外视频已成为数千万人的日常习惯,进而促进了视频翻译需求量的不断增加。那么,如何做好多媒体视频翻译服务,关于多媒体视频翻译,你了解多少? 据了解&…

day5 6 7-牛客67道剑指offer-JZ43、45、49、50、51、52、53、55、79、数组中只出现一次的数字

文章目录 1. JZ43 整数中1出现的次数(从1到n整数中1出现的次数)2. JZ45 把数组排成最小的数3. JZ49 丑数最小堆三指针法 动态规划 4. JZ50 第一个只出现一次的字符5. JZ51 数组中的逆序对6. JZ52 两个链表的第一个公共结点迭代递归 7. JZ53 数字在升序数…

当编程式事务写在了声明式事务的代码中,会怎么样?

1、背景 上一篇文章,为解决大事务问题,将for循环的每个订单的处理放在了编程式事务的代码中,但是在落地的时候,遇到了一个比较特殊的情况,外层方法中使用了 Transactional注解,内部再用编程式事务&#xf…