详解如何为SpringBoot Web应用的日志方便追踪

 更新时间:2023年11月01日 08:33:32   作者:JAVA旭阳  
在Web应用程序领域,有效的请求监控和可追溯性对于维护系统完整性和诊断问题至关重要,SpringBoot是一种用于构建Java应用程序的流行框架,在本文中,我们探讨了在SpringBoot中向日志添加唯一ID的重要性,需要的朋友可以参考下

前言

在 Web 应用程序领域,有效的请求监控和可追溯性对于维护系统完整性和诊断问题至关重要。Spring Boot 是一种用于构建 Java 应用程序的流行框架,它提供了强大的日志记录功能,可以通过为每个传入请求合并唯一标识符来进一步丰富这些功能。这种简洁而强大的实践使开发人员能够跟踪和分析单个请求流,从而简化调试并增强整体系统的可靠性。在本文中,我们探讨了在 Spring Boot 中向日志添加唯一 ID 的重要性,深入了解其实现以及它为应用程序开发和维护带来的众多好处。

问题

如今,我们通常为每项服务配备多个服务器。现在有两种检查日志的方法,第一种是进入单个服务器实例并检查日志。还有另一种方法可以从所有服务器收集日志,并且可以在一个地方查看它们。人们通常使用第二种方法来搜索和分析日志。现在,单个服务的多个服务器有如此多的日志,跟踪日志变得很困难。

此外,即使我们有一个服务的单个服务器,由于并发请求/线程,也会打印许多日志。面临的一个主要问题是跟踪,因为日志以交错方式打印。跟踪打印的日志变得非常困难。

解决方案

为了解决上述问题,我们需要某种与每个日志条目关联的标识符。我们可以生成一个唯一的 ID,然后将该 ID 分配给特定请求的所有日志。因此,为特定请求生成的所有日志都将具有唯一的 ID。借助这个ID,我们可以轻松地通过日志进行追踪。我们可以在日志中搜索这个ID并获取特定请求的所有日志。为了在 Spring Boot 中实现这一点,我们可以使用 AOP。

面向方面编程(AOP)是一种编程范式,允许开发人员将横切关注点(例如日志记录、安全性和事务管理)模块化,与核心业务逻辑分开,从而提高代码的可重用性和可维护性。它通过引入“方面”来实现这一点,这些“方面”可以应用于代码库的不同部分,而无需更改原始代码。

首先,您必须创建一个如下所示的请求过滤器。

/**
 * A filter that adds a key to the Mapped Diagnostic Context (MDC) to each request so you can print a unique id in the log messages of each request
 **/
@EqualsAndHashCode(callSuper = false)
@Component
@Slf4j
public class Slf4jMDCFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain) {
        try {
            MDC.put(MDC_UUID_TOKEN_KEY, UUID.randomUUID().toString());
            chain.doFilter(request, response);
        } catch (Exception ex) {
            log.error(ERROR_FORMAT, "Exception occurred in filter while setting UUID for logs", ex);
        } finally {
            MDC.remove(MDC_UUID_TOKEN_KEY);
        }
    }

    @Override
    protected boolean isAsyncDispatch(final HttpServletRequest request) {
        return false;
    }

    @Override
    protected boolean shouldNotFilterErrorDispatch() {
        return false;
    }
}

上述代码针对每个 API 请求运行一次,并将相同的唯一 ID 添加到为特定请求生成的所有日志中。接下来,您必须将上述 AOP 过滤器注册为 bean,如下所示:

@Configuration
@RequiredArgsConstructor
public class BeanConfig {
    private final Slf4jMDCFilter slf4jMDCFilter;

    @Bean
    public FilterRegistrationBean<Slf4jMDCFilter> servletRegistrationBean() {
        final FilterRegistrationBean<Slf4jMDCFilter> filterRegistrationBean = new FilterRegistrationBean<>();
        filterRegistrationBean.setFilter(slf4jMDCFilter);
        filterRegistrationBean.setOrder(2);
        return filterRegistrationBean;
    }
}

之后,您需要在日志文件中添加一个附加程序,如下所示:

<appender name="Console"
  class="ch.qos.logback.core.ConsoleAppender">
  <layout class="ch.qos.logback.classic.PatternLayout">
    <Pattern>
      %black(%d{ISO8601}) %X{Slf4jMDCFilter.UUID} %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
    </Pattern>
  </layout>
</appender>

总结

在 Spring Boot 中为每个请求在日志中实现唯一的 ID 可以通过关联应用程序不同组件之间的日志来实现更好的可跟踪性和调试,特别是在并发场景中。这个唯一的标识符有助于跟踪请求流、识别潜在问题并提高整体系统的可观察性。

以上就是详解如何为Spring Boot Web应用的日志方便追踪的详细内容,更多关于Spring Boot Web日志追踪的资料请关注脚本之家其它相关文章!

相关文章

  • springboot中jsp配置tiles全过程

    springboot中jsp配置tiles全过程

    这篇文章主要介绍了springboot中jsp配置tiles全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • 解析maven的用法和几个常用的命令(推荐)

    解析maven的用法和几个常用的命令(推荐)

    maven最大的作用就是用于对项目中jar包依赖的统一管理。这篇文章主要介绍了maven的用法和几个常用的命令,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • SpringBoot对Druid配置SQL监控功能失效问题及解决方法

    SpringBoot对Druid配置SQL监控功能失效问题及解决方法

    这篇文章主要介绍了SpringBoot对Druid配置SQL监控功能失效问题的解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • Java利用TCP实现服务端向客户端消息群发的示例代码

    Java利用TCP实现服务端向客户端消息群发的示例代码

    这篇文章主要为大家详细介绍了Java如何利用TCP协议实现服务端向客户端消息群发功能,文中的示例代码讲解详细,需要的可以参考下,希望对你有所帮助
    2022-08-08
  • Java中ArrayList去除重复元素(包括字符串和自定义对象)

    Java中ArrayList去除重复元素(包括字符串和自定义对象)

    本文主要介绍了Java中ArrayList去除重复元素(包括字符串和自定义对象)的方法。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • 在IntelliJ IDEA中创建和运行java/scala/spark程序的方法

    在IntelliJ IDEA中创建和运行java/scala/spark程序的方法

    这篇文章主要介绍了在IntelliJ IDEA中创建和运行java/scala/spark程序的教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • spring boot项目快速构建的全步骤

    spring boot项目快速构建的全步骤

    这篇文章主要给大家介绍了关于spring boot项目快速构建的全步骤,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • SpringBoot 配置文件给实体注入值方式

    SpringBoot 配置文件给实体注入值方式

    这篇文章主要介绍了SpringBoot 配置文件给实体注入值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • JavaCV调用百度AI实现人脸检测方法详解

    JavaCV调用百度AI实现人脸检测方法详解

    在检测人脸数量、位置、性别、口罩等场景时,可以考虑使用百度开放平台提供的web接口,一个web请求就能完成检测得到结果。本文就为大家介绍JavaCV如何调用百度AI实现最简单的人脸检测,需要的可以参考一下
    2022-01-01
  • Java连接FTP服务器并使用ftp连接池进行文件操作指南

    Java连接FTP服务器并使用ftp连接池进行文件操作指南

    使用FTP最主要的功能是对文件进行管理,下面这篇文章主要给大家介绍了关于Java连接FTP服务器并使用ftp连接池进行文件操作的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08

最新评论