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


前言

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

本文的主要内容就是深入探讨日志在 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 的简化,我们可以更加便捷地实现日志输出,避免了手动定义日志对象和导入日志框架包的麻烦,提高了代码的可读性和简洁性。

猜你喜欢

转载自blog.csdn.net/qq_61635026/article/details/132124489