返回顶部
首页 > 资讯 > 精选 >如何使用MDC快速查询应用接口全部执行日志
  • 251
分享到

如何使用MDC快速查询应用接口全部执行日志

2023-07-04 23:07:40 251人浏览 独家记忆
摘要

这篇文章主要介绍“如何使用MDC快速查询应用接口全部执行日志”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用MDC快速查询应用接口全部执行日志”文章能帮助大家解决问题。MDCMDC是日志门面框

这篇文章主要介绍“如何使用MDC快速查询应用接口全部执行日志”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用MDC快速查询应用接口全部执行日志”文章能帮助大家解决问题。

MDC

MDC是日志门面框架SLF4J提供的一个类,可以提供在多线程情况下记录日志的功能,log4j、logback、log4j2都有对这个类的实现。

从本质上来说,MDC可以看做一个ThreadLocal,由于其线程安全的特性,可以让我们轻松安全的保存数据。

如何使用MDC快速查询应用接口全部执行日志

MDC主要的api有clear()、get()、put()、remove()方法等,简洁的api让我们使用上手基本没有难度。

如何使用

1,修改日志打印格式

以日志框架logback为例,在logback.xml中,找到日志打印规则的配置,添加**-%X{reqId}** 属性,其中reqId可以任意指定,你写其他的属性也可以,博主这里演示指定为reqId。

<encoder>  <pattern>-%X{reqId} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %file:%line %msg%n</pattern>  <charset>UTF-8</charset></encoder>

2,添加过滤器MDCFilter

ps.使用拦截器也可以,效果是一样的。对每个接口做拦截。

@Component@AllArgsConstructor@Order(Ordered.HIGHEST_PRECEDENCE)@Slf4jpublic class MDCFilter implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {    }    @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {        try {            //给每个请求接口生成一个requestId            String requestId = RandomUtil.randomNumbers(10);            //这里的reqId就是上面配置的,要保持一致            MDC.put("reqId", "reqId:" + requestId);            chain.doFilter(request, response);        } finally {            MDC.clear();        }    }    @Override    public void destroy() {    }}

经过简单的两步就配置好了,下面我们看一下效果。

@PostMapping(value = "/mdcTest")public ResponseEntity&lt;Object&gt; mdcTest(String id, String name) {    log.info("测试日志打印,id={},name={}", id, name);    log.info("测试日志打印1");    log.info("测试日志打印2");    log.info("测试日志打印3");    log.info("测试日志打印4");    return ResponseEntity.ok().build();}

如何使用MDC快速查询应用接口全部执行日志

每一行日志都有一个关键字reqId:9723829830,这样我们查询日志时只需要查询关键字9723829830就可以直接查出来这个接口所有的执行记录了。

如果想更方便的话,也可以把这个关键字直接输出到每一个接口的响应头或者响应体中。

进阶使用

对于普通的WEB应用我们可以直接拦截每个接口,自动生成一个请求id,那么对于微服务项目,一个接口可能会产生很多服务的调用,那如何一次性查出来所有系统内的日志呢?

对于日志的搜集本文暂不考虑,咱们先说如何做请求id的传递。

其实也很简单,当我们有多个系统间的调用时,把reqId放到request的header中进行传递,然后下游系统获取这个id就可以了。

比如下方的拦截器:

public class LogInterceptor implements HandlerInterceptor {    @Override    public boolean preHandle(httpservletRequest request, HttpServletResponse response, Object handler) throws Exception {        //如果有上层调用就从header中取出上层的ID        String traceId = request.getHeader("reqId");        if (traceId == null) {            //如果没有,就生成一个默认的            traceId = RandomUtil.randomNumbers(10);        }        MDC.put("reqId", traceId);        return true;    }    @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)            throws Exception {    }    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)            throws Exception {        //调用结束后删除        MDC.remove("reqId");    }}

MDC存在的一些问题

我们在上文说过,MDC的本质是ThreadLocal,它会把数据都绑定到当前线程上。但是当我们使用多线程的时候,就会带来一个数据丢失的问题。

所以,我们需要进行线程间的数据传递,保证MDC数据不丢失。

线程池传递数据为例,ThreadPoolTaskExecutor提供了一个taskDecorator装饰器,通过这个属性,我们就可以实现属性的传递。

首先,定义一个MDCContextDecorator,

public class MDCContextDecorator implements TaskDecorator {    @Override    public Runnable decorate(Runnable runnable) {        Map&lt;String,String&gt; previous = MDC.getCopyOfContextMap();        return () -&gt; {            try {                if (previous != null) {                    MDC.setContextMap(previous);                }                runnable.run();            } finally {                MDC.clear();            }        };    }}

然后设置线程池的taskDecorator属性,

public ThreadPoolTaskExecutor executor() {  ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();  executor.setCorePoolSize(5);  executor.setMaxPoolSize(20);  //...其他属性  //设置线程属性的自动传递  executor.setTaskDecorator(new MDCContextDecorator());  return executor;}

关于“如何使用MDC快速查询应用接口全部执行日志”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: 如何使用MDC快速查询应用接口全部执行日志

本文链接: https://lsjlt.com/news/348173.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用MDC快速查询应用接口全部执行日志
    目录引言引言 对于每一个开发者来说,查询接口的执行日志都是一个高频率的操作,每当测试说接口有问题时,我们都需要去服务器或者日志系统上查报错的原因。 一般情况下,我们会通过对应的关键...
    99+
    2023-01-08
    MDC查询接口执行日志 MDC 查询接口
  • 如何使用MDC快速查询应用接口全部执行日志
    这篇文章主要介绍“如何使用MDC快速查询应用接口全部执行日志”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用MDC快速查询应用接口全部执行日志”文章能帮助大家解决问题。MDCMDC是日志门面框...
    99+
    2023-07-04
  • 如何在ASP应用程序中快速实现日志记录接口?
    ASP是一种流行的Web应用程序平台,但是在开发ASP应用程序时,很多开发人员会遇到日志记录的问题。日志记录对于应用程序的可维护性和可靠性非常重要,因此在ASP应用程序中快速实现日志记录接口是一个非常必要的任务。 在本文中,我们将介绍如何在...
    99+
    2023-10-05
    npm 日志 接口
  • ASP 日志 api 接口:如何快速集成到您的应用程序中?
    ASP 日志 API 接口:如何快速集成到您的应用程序中? 随着信息技术的不断发展,越来越多的应用程序需要记录用户行为、系统运行日志等信息。而 ASP 日志 API 接口正是解决这一问题的有效途径。本文将为您介绍如何快速集成 ASP 日志 ...
    99+
    2023-06-19
    日志 api 接口
  • 如何在MySQL中使用慢查询日志
    这期内容当中小编将会给大家带来有关如何在MySQL中使用慢查询日志,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。慢查询日志相关参数MySQL 慢查询的相关参数解释:slo...
    99+
    2024-04-02
  • 如何使用快递单号物流查询接口通用API
    这篇文章主要介绍了如何使用快递单号物流查询接口通用API,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。快递查询接口通用API是给发货电商用来实现查询快递物流轨迹功能的,接口对...
    99+
    2023-06-02
  • 如何使用Java重定向日志接口记录日志?
    当我们开发一个Java应用程序时,记录日志是非常重要的一个环节。Java提供了多种日志框架,如Log4j、Logback等。其中,重定向日志接口是一种常用的记录日志的方式。 在这篇文章中,我们将介绍如何使用Java重定向日志接口记录日志。我...
    99+
    2023-11-05
    重定向 日志 接口
  • GO实时日志框架:如何快速地记录和查看你的应用程序日志?
    日志记录是应用程序开发中非常重要的一环。它是帮助开发人员调试和排查问题的重要手段。在开发过程中,我们需要将程序运行时的信息记录到日志文件中,这样可以在应用程序出现问题时追踪问题的根源。在GO语言中,有许多实时日志框架可以帮助我们实现这一目...
    99+
    2023-10-14
    实时 日志 框架
  • 如何利用Java日志技术,快速排查应用程序异常问题?
    随着互联网的飞速发展,应用程序的重要性越来越被人们所重视。然而,应用程序的开发和维护并不是一件容易的事情,往往会出现各种各样的异常问题。这些异常问题如果不能快速地被排查和解决,可能会严重影响应用程序的性能和用户体验。 Java是一种流行的...
    99+
    2023-11-09
    同步 numy 日志
  • 如何利用ASP接口实现大数据索引的快速查询?
    如何利用ASP接口实现大数据索引的快速查询? 随着大数据时代的到来,数据量的增长使得数据的查询变得越来越复杂和困难。这时候,我们需要一种快速高效的数据查询方式,这就是利用ASP接口实现大数据索引的快速查询。本文将会介绍如何利用ASP接口实现...
    99+
    2023-10-04
    接口 大数据 索引
  • 如何使用 Golang 执行原生 SQL 查询?
    如何在 go 中执行原生 sql 查询:导入必要包(如 database/sql 和数据库驱动程序)。打开数据库连接。使用 db.prepare 方法准备 sql 语句。使用 stmt....
    99+
    2024-05-14
    golang 原生 sql mysql git
  • ELK日志系统中如何进行通用应用程序日志接入
    这篇文章给大家介绍ELK日志系统中如何进行通用应用程序日志接入,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。日志规范规范的日志存放路径和输出格式将为我们后续的收集和分析带来极大的方便,无需考虑各种不同路径、格式的兼容问...
    99+
    2023-06-19
  • 【MYSQL高级】Mysql找出执行慢的SQL【慢查询日志使用与分析】
    文章目录 分析慢SQL的步骤慢查询日志(定位慢sql)基本介绍慢查询日志是什么?特别说明 查看慢查询日志是否开以及如何开启设置慢SQL的时间阈值查看阈值设置阈值 查询慢查询日志文件...
    99+
    2023-09-18
    mysql sql adb
  • 如何使用Go语言快速索引Apache接口?
    Go语言是一门轻量级的编程语言,它具有高效的并发性和出色的性能,因此在现代Web开发中被广泛使用。在本文中,我们将探讨如何使用Go语言快速索引Apache接口。 首先,让我们来了解一下什么是Apache接口。Apache接口(简称API)是...
    99+
    2023-08-28
    索引 apache 接口
  • 如何在Java应用程序中正确地使用重定向日志接口?
    在Java应用程序中,重定向日志接口是非常重要的一个功能。它可以帮助我们更好地管理应用程序的日志,以及确保日志信息能够被正确地保存和处理。在本篇文章中,我们将介绍如何在Java应用程序中正确地使用重定向日志接口。 一、重定向日志接口的基本概...
    99+
    2023-11-05
    重定向 日志 接口
  • 如何利用 ASP 日志记录函数快速诊断响应速度问题?
    ASP是一种广泛使用的服务器端脚本语言,用于开发动态网站和Web应用程序。当网站或应用程序出现响应速度问题时,ASP日志记录函数可以帮助我们快速诊断问题。 ASP日志记录函数是一种可在ASP脚本中使用的日志记录工具,它可以帮助我们记录应用程...
    99+
    2023-09-08
    日志 函数 响应
  • 如何使用Spring Data Jpa查询全部并排序
    这篇文章将为大家详细讲解有关如何使用Spring Data Jpa查询全部并排序,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Spring Data Jpa查询全部并排序1、Repository层只需要简...
    99+
    2023-06-25
  • ASP项目中如何使用npm安装日志接口?
    ASP项目是一种常见的Web应用程序开发框架,它在开发过程中需要使用到各种工具和插件。其中,日志接口是一个非常重要的组件,它可以帮助开发人员追踪和解决各种问题。本文将介绍如何在ASP项目中使用npm安装日志接口,并提供演示代码,帮助读者快...
    99+
    2023-10-05
    npm 日志 接口
  • SpringBoot 如何使用Dataway配置数据查询接口
    目录Dataway介绍第一步:引入相关依赖第二步:配置 Dataway,并初始化数据表第三步:配置数据源第四步:把数据源设置到 Hasor 容器中第五步:在SprintBoot 中启...
    99+
    2024-04-02
  • 如何使用MybatisPlus快速进行增删改查详解
    目录前言:1.数据库建表2.新建一个springboot项目(1)、引入相应的jar包(2)、快速启动项目3.springboot结合mybatisplus(1)、引入mybatis...
    99+
    2022-11-13
    mybatisplus增删改查实例 mybatisplus增删改查方法 mybatis增删改查项目
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作