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

news2024/7/6 19:05:22

文章目录

  • 前言
  • 一、日志文件的作用
  • 二、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.coloradmin.cn/o/842080.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vuejs源码分析之全局API(vm.$off)

vue在初始化的时候会给vue对象本身挂载一些全局的api。今天我们一个一个来看这些api。 vm.$off方法 这个方法是用来移除自定义事件监听器。 他的用法 vm.$off(event, calback)第一个参数event取值可以是string字符串&#xff0c;也可以是Array<string>也就是说既可以删…

mysql8查看执行sql历史日志、慢sql历史日志,配置开启sql历史日志general_log、慢sql历史日志slow_query_log

0.本博客sql总结 -- 1.查看参数 -- 1.1.sql日志和慢sql日志输出方式(TABLE/FILE)。global参数 SHOW GLOBAL VARIABLES LIKE log_output; -- 1.2.sql日志开关。global参数 SHOW GLOBAL VARIABLES LIKE general_log%; -- 1.3.慢sql日志开关。global参数 SHOW GLOBAL VARIABLE…

wpf 3d 坐标系和基本三角形复习

wpf 3d 坐标系的描述见此&#xff0c; WPF 3d坐标系和基本三角形_wpf 坐标系_bcbobo21cn的博客-CSDN博客 X轴正向向右&#xff0c;Y轴正向向上&#xff1b;Z轴&#xff0c;正向是从屏幕里边出来&#xff0c;负向是往屏幕里边去&#xff1b;坐标原点是在呈现区域的中心&#x…

TestDataLake在提升测试效能方面的实践

目录 1.背景 2.预期目标 3.系统设计和实现 3.1系统功能组成 3.2 数据智能生成 3.3 接口遍历测试 4.应用效果和收益 5.后续规划 1.背景 随着软件开发的迅速发展&#xff0c;测试数据管理变得越来越复杂。手动创建测试数据需要耗费大量时间和精力&#xff0c;同时容易出…

bigemap用于自然资源调查规划设计院

获取途径&#xff1a;之前看到别人使用我们软件&#xff0c;然后去我们官网下载地图体验了一下&#xff0c;想试试。买单点&#xff1a;影像清晰&#xff0c;最主要是使用手机端&#xff0c;跑外业&#xff0c;定位&#xff0c;记录轨迹&#xff0c;拍照&#xff0c;等高线制作…

网络安全进阶学习第十三课——SQL注入Bypass姿势

文章目录 一、等号被过滤二、substr、mid等被过滤三、逗号被过滤四、and/or被过滤五、空格被过滤五、其他绕过方式 一、等号被过滤 1、like&#xff0c;rlike语句&#xff0c;其中rlike是正则2、大于号>&#xff0c;小于号<3、符号<>&#xff1a;<>为不等于…

认识 spring AOP (面向切面编程) - springboot

前言 本篇介绍什么是spring AOP, AOP的优点&#xff0c;使用场景&#xff0c;spring AOP的组成&#xff0c;简单实现AOP 并 了解它的通知&#xff1b;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文章目录 前言1. 什么是s…

Automa-通过连接块来自动化你的浏览器

1、前言 通过浏览器插件可实现自动化脚本的录制与编写&#xff0c;具有代表性的工具就是&#xff1a;Selenium IDE、Katalon Recorder&#xff0c;对于简单的业务来说可快速实现自动化的上手工作。 Selenium IDE Katalon Recorder 如果你想学习接口自动化测试&#xff0c;我这…

1990-2021年31省数字经济测算指标(20多个指标)

1990-2021年31省数字经济测算指标&#xff08;20多个指标&#xff09; 1、来源&#xff1a;国家统计局 2、时间&#xff1a;1990-2021年 3、范围&#xff1a;31省 4、指标&#xff1a; 地区、年份、邮电业务总量、邮政业务总量、电信业务总量、函件数(亿件)、包裹数(万件)、…

selenium常用API的使用

目录 定位元素&#xff08;findElement&#xff09; CSS选择器定位 xpath选择器定位 CSS选择器和xpath选择器区别 操作测试对象 click&#xff1a;点击 sendKeys&#xff1a;输入文本框内容 clear&#xff1a;清除文本框内容 text&#xff1a;获取元素文本内容 …

JVM之类加载与字节码(二)

3. 编译期处理 什么是语法糖 所谓的 语法糖 &#xff0c;其实就是指 java 编译器把 *.java 源码编译为 *.class 字节码的过程中&#xff0c;自动生成 和转换的一些代码&#xff0c;主要是为了减轻程序员的负担&#xff0c;算是 java 编译器给我们的一个额外福利&#xff08;给…

看跨境电商世界区域分布,Live Market教你深入参与跨境创业

随着全球化发展带来互联网技术的进步和平台经济的触角伸向全球&#xff0c;跨境电商越来越成为全球贸易的重要组成部分。根据国际数据公司&#xff08;IDC&#xff09;的最新数据显示&#xff0c;全球前五大跨境电商平台分别是亚马逊、阿里巴巴、eBay、Wish和京东全球购。这五家…

【Linux】内核线程创建 kthread_run 函数和内核中断

kthread_run函数详解 以PCIE的热插拔内核线程创建为例说明 注意&#xff1a;内核线程和RTOS的线程略有不同&#xff0c;这里Linux上创建以后直接运行&#xff0c;RTOS上有的是需要加入到调度队列中后才会执行&#xff0c;比如RT-Thread的系统 kthread_run 是 Linux 内核中的…

人类与机器的分类不同

分类能力也是智能的重要标识之一。通过分类&#xff0c;我们可以将事物或概念进行归类和组织&#xff0c;从而更好地理解和处理信息。分类在人类认知和智能发展中起到了重要的作用&#xff0c;它有助于我们对世界进行认知、记忆、推理和决策。在机器智能领域&#xff0c;分类同…

企业服务器器中了360后缀勒索病毒怎么解决,勒索病毒解密数据恢复

随着网络威胁的增加&#xff0c;企业服务器成为黑客攻击的目标之一。近期&#xff0c;上海某知名律师事务所的数据库遭到了360后缀的勒索病毒攻击&#xff0c;导致企业服务器内的数据库被360后缀勒索病毒加密。许多重要的数据被锁定无法正常读取&#xff0c;严重影响了企业的正…

基于STM32CUBEMX驱动低压步进器电机驱动器STSPIN220(2)----驱动STSPIN220

基于STM32CUBEMX驱动低压步进器电机驱动器STSPIN220----2.驱动STSPIN220 套件概述样品申请STSPIN220描述STSPIN220所有功能基础配置REF电流配置细分配置IO配置定时器配置初始化mode 套件概述 本文档的目标是提供关于使用STM32CubeMX驱动低压步进电机驱动器STSPIN220的详尽信息…

vue2中使用mock数据发送请求

1.安装 npm i mockjs1.1 2.准备json数据 说明&#xff1a;mock数据需要的图片放置到public文件夹中&#xff08;原封不动的打包到dist文件夹&#xff09; [{"id": "1","imgUrl": "/images/banner1.jpg"},{"id": "2&qu…

每天一道leetcode: 57.和为s的两个数字

今日份题目&#xff1a; 输入一个递增排序的数组和一个数字s&#xff0c;在数组中查找两个数&#xff0c;使得它们的和正好是s。如果有多对数字的和等于s&#xff0c;则输出任意一对即可。 示例1 输入&#xff1a;nums [2,7,11,15], target 9 输出&#xff1a;[2,7] 或者 …

一文带你快速了解【在树莓派上搭建web网站---并在外网可访问】

文章目录 概述使用 Raspberry Pi Imager 安装 Raspberry Pi OS测试 web 站点安装静态样例站点 将web站点发布到公网安装 Cpolarcpolar进行token认证生成cpolar随机域名网址生成cpolar二级子域名将参数保存到cpolar配置文件中测试修改后配置文件配置cpolar服务开机自启动 概述 …

Gson 添加数据默认值问题记录

问题&#xff1a;在用Gson add(key&#xff08;string类型&#xff09;&#xff0c;value&#xff08;必须是JsonElement子类&#xff09;&#xff09;时发现&#xff0c;value 传了 "" 空字符串&#xff08;非null&#xff09;&#xff0c;默认解析后返回null&#…