展开

关键词

Spring Async的使用&MDC继承

另外为了方便跟踪请求日志,一般会借助MDC在日志中输出traceId,但是跨线程执行的时候的,MDC信息并不会传递,所以需要自定义线程执行器。 自定义MDC可继承的ThreadPoolTaskExecutor----当我们在日志中使用MDC实现调用链路跟踪时(使用traceId),如果异步调用,则会丢失MDC信息。 private boolean useFixedContext; final private Map fixedContext; ** * Pool where task threads take MDC fixedContext : MDC.getCopyOfContextMap(); } ** * All executions will have MDC injected. 可以看到traceId也传递到线程Anno-Executor1了参考自带监控&兼容MDC的线程池Spring @Async异步调用(异步线程池)

62021

自带监控&兼容MDC的线程池

在使用slf4j的MDC做日志跟踪的时候,会因为MDC不能跨线程导致跟踪失败,此外,为了监控线上服务器的运行状态,也很有必要对线程池的运行情况进行监控。 下面是一个带有线程池监控且兼容MDC的线程池,建议使用! ** * A SLF4J MDC-compatible {@link ThreadPoolExecutor}. * * In general, MDC is used to store diagnostic However, although MDC data is passed to thread children, this doesnt work when threads are reused in fixedContext : MDC.getCopyOfContextMap(); } ** * All executions will have MDC injected.

37720
  • 广告
    关闭

    腾讯云前端性能优化大赛

    首屏耗时优化比拼,赢千元大奖

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MDC是什么鬼?用法、源码一锅端

    MDC 快速入门;2. MDC 源码解读;3. MDC 能干什么?阿里开源项目 Canal:?老项目这么用过: ? 但是无论怎么用,都逃不过 MDC API 的使用,下面先花一分钟快速入门,然后再逐步去深入 MDC。1. MDC 快速入门MDC 全称是 Mapped Diagnostic Context,可以粗略的理解成是一个线程安全的存放诊断日志的容器。 中可以通过声明 %X{REQ_ID} 来输出 MDC 中 REQ_ID 的信息;c)MDC 提供的 remove 方法,可以清除 MDC 中指定 key 对应的键值对信息。 MDC 能干什么?MDC 的应用场景其实蛮多的,下面简单列举几个。

    1K30

    操作日志追踪记录之MDC入门

    MDC 的作用是解决这个问题。  MDC 可以看成是一个与当前线程绑定的哈希表,可以往其中添加键值对。MDC 中包含的内容可以被同一线程中执行的代码所访问。 当前线程的子线程会继承其父线程中的 MDC 的内容。当需要记录日志时,只需要从 MDC 中获取所需的信息即可。MDC 的内容则由程序在适当的时候保存进去。 MDC使用场景MDC可以将一个处理线程中你想体现在日志文件中的数据统一管理起来,根据你的日志文件配置决定是否输出。   ,结合grep命令能根据跟踪编号将本次的处理日志全部输出)MDC如何使用MDC我个人会用AOP或Filter或Interceptor这类工具配合使用,获得你希望输出到日志的变量并调用MDC.put(String 如果没有MDC我猜此时此刻你应该处于雪崩状态。

    1.4K20

    我不是最后一个知道MDC的吧?

    * 此方法将所有工作委托给底层日志系统的MDCMDC功能测验以上,我们大致知道了MDC做了什么了。这仅仅是我们自己看了别人在项目代码里用MDC以及MDC的一点源码得到的一些信息。 而有了MDC,再配合linux的grep用关键字抽取日志,那就方便多了。MDC还挺棒的呢!以上是通过项目里使用MDC,然后通过自己的小测验和简单的一点源码来对MDC有了一个初步的了解。 slf4j中MDC是什么鬼MDC从使用方式上与我们常用的记录日志的方式有些不同,我对它的理解是MDC可以将一个处理线程中你想体现在日志文件中的数据统一管理起来,根据你的日志文件配置决定是否输出。 使代码简洁、日志风格统一小结到这里MDC就告一段落了,我们了解了MDC的基本使用和好处,小伙伴们你们学会了吗?

    26620

    知道MDC,那NDC是什么?这个知识有点冷

    在项目开发中,经常会巧妙借助 MDC 解决链路跟踪、统计耗时等很多问题,通过往期分享的《MDC是什么鬼? 上面这个代码来源于 MDC 分享,只是把类名换成了 SimpleNDC,然后把 MDC 相关的 API 换成了 NDC。 NDC 与 MDC 有何不同?a)MDC vs NDC ? b) MDC vs NDC ? 中所有的值;c)MDC vs NDC?

    47520

    Java日志Log4j或者Logback的NDC和MDC功能

    01NDC和MDC的区别Java中使用的日志的实现框架有很多种,常用的log4j和logback以及java.util.logging,而log4j是apache实现的一个开源日志组件(Wrapped 说完基本的日志框架的区别之后,我们再看看NDC和MDC。 sId) { put(MdcConstants.SESSION_ID, sId); } public static void clear() { MDC.clear(); logger.debug(mdc clear done.); }}上述工具类中MdcConstants是定义一个常量的类,定义了SERVER、SESSION_ID等,put方法就是调用了slf4j的MDC的put方法。 Soga,我们需要清除上次请求的一些无用的信息,再次将我们的信息写入到MDC中(拦截器的配置在DispatcherServlet中),由于afterConcurrentHandlingStarted()

    1.4K20

    SLF4J MDC ☞ 将用户信息添加到日志信息中

    前言你是否有过排查某个用户的操作出现 BUG 时, 从茫茫日志中寻找这个用户操作的痛苦经历, SLF4J 为我们提供了一种基于 ThreadLocal 来实现的 MDC 功能, 用来将自定义信息放入到日志中 .你可能没太明白啥意思, 那么先来看看效果把:普通日志: image.png 加上MDC的日志: image.png 食用方式可以使用过滤器, 拦截器或 AOP 等方式来实现, 即在用户请求时, 将用户信息写入到 MDC 中, 然后在请求完成后, 清空此 MDC.我这里使用 SpringMVC 的拦截器 HandlerInterceptor 来演示下, (我这里使用了 Shiro, 所以会调用 Shiro 的代码来获取当前登录用户 ModelAndView modelAndView) throws Exception { String username = MDC.get(MDC_USERNAME); LOGGER.debug(MDC registry.addInterceptor(logInterceptor); super.addInterceptors(registry); }}然后在日志格式中使用 %X{username} 将 MDC

    33020

    以太网PHY控制器配置接口(MDC MDIO)

    2,用示波器抓取mdc和mdio波形,读PHY寄存器没有数据响应。

    12100

    如何将csv包含的数据导入SAP Cloud Platform HANA MDC

    instead, which only requires the SAP HANA Web-based Development Workbench available with any SAP HANA MDC allow us to adapt the structure easily without reloading the data.首先在SAP Cloud Platform Neo环境的HANA MDC 创建一个table-import配置文件,在里面指定存储于csv文件里的数据,按照怎样的逻辑写入HANA MDC的持久化对象,比如数据库表里。 hdb package里创建一个新的文件data.hdbti :import = ;此时执行下列SQL语句,就可以成功从HANA MDC实例的数据库表里读取源自csv文件里的数据了:select links

    14310

    如何将csv包含的数据导入SAP Cloud Platform HANA MDC

    instead, which only requires the SAP HANA Web-based Development Workbench available with any SAP HANA MDC allow us to adapt the structure easily without reloading the data.首先在SAP Cloud Platform Neo环境的HANA MDC (public.aa.movielens.hdb::user,MOVIELENS_USER);创建一个table-import配置文件,在里面指定存储于csv文件里的数据,按照怎样的逻辑写入HANA MDC hdb package里创建一个新的文件data.hdbti :import = ;此时执行下列SQL语句,就可以成功从HANA MDC实例的数据库表里读取源自csv文件里的数据了:select links

    21530

    SpringBoot如何实现全链路调用日志跟踪

    MDC介绍简介:MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 、logback及log4j2 提供的一种方便在多线程条件下记录日志的功能。 MDC 可以看成是一个与当前线程绑定的哈希表,可以往其中添加键值对。MDC 中包含的内容可以被同一线程中执行的代码所访问。当前线程的子线程会继承其父线程中的 MDC 的内容。 当需要记录日志时,只需要从 MDC 中获取所需的信息即可。MDC 的内容则由程序在适当的时候保存进去。 对于一个 Web 应用来说,通常是在请求被处理的最开始保存这些数据API说明: clear() => 移除所有MDC get (String key) => 获取当前线程MDC中指定key的值 getContext () => 获取当前线程MDCMDC put(String key, Object o) => 往当前线程的MDC中存入指定的键值对 remove(String key) => 删除当前线程MDC中指定的键值对

    66610

    日志排查问题困难?分布式日志链路跟踪来帮你

    } MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。 MDC 可以看成是一个与当前线程绑定的Map,可以往其中添加键值对。MDC 中包含的内容可以被同一线程中执行的代码所访问。当前线程的子线程会继承其父线程中的 MDC 的内容。 当需要记录日志时,只需要从 MDC 中获取所需的信息即可。MDC 的内容则由程序在适当的时候保存进去。对于一个 Web 应用来说,通常是在请求被处理的最开始保存这些数据。 三、方案实现由于MDC内部使用的是ThreadLocal所以只有本线程才有效,子线程和下游的服务MDC里的值会丢失;所以方案主要的难点是解决值的传递问题。3.1. Callable task, Map mdcContext) throws Exception { 将父线程的MDC内容传给子线程 if (mdcContext !

    53420

    Material Design Compoents 1.1.0

    MDC 的目的是为开发者提供一个库,该库通过代码形式来实现这些组件和准则。随着指南不断的变化更新,MDC 将进行调整并更新来满足新的规范。 MDC 可以立即使用 Material Dark 主题。 海拔表面增亮:所有 MDC 组件都支持其表面增亮来传达黑暗主题中的海拔。指南中的白色覆盖投影映射到组件上设置的 elevation 的数值。可访问性:MDC 利用颜色来区分是否可以访问。 MDC 现在使用推荐的颜色和不透明度来确保是这种情况。Primary 和 Surface 颜色切换:MDC 组件遵循指南,减少在深色主题中使用 Primary 色。 MDC的下一步计划我们已经收到了您关于 MDC 版本的反馈。我们致力于更新并且整合您的重要贡献。

    20610

    方块处理(1) ---十天教会你俄罗斯方块

    RECT_LOWER_XSIDE_LEN)全局变量int g_arrBackGround = {0};产生背景数组void OnPaint(HDC hDC){创建兼容性DC(内存DC)--纸的编号HDC mDC 创建兼容性位图--纸本身HBITMAP hBitmap = CreateCompatibleBitmap(hDC,WND_WIDTH,WND_HEIGHT);将DC与位图关联SelectObject(mDC , hBitmap);画方块PaintSquare(mDC);从内存DC到窗口DC传递BitBlt(hDC,0,0,RECT_LOWER_X,RECT_LOWER_Y,mDC,0,0,SRCCOPY); 释放位图DeleteObject(hBitmap);释放DCDeleteDC(mDC);}void PaintSquare(HDC mDC){int i = 0;int j = 0;画矩形框Rectangle (mDC,RECT_UPPER_X,RECT_UPPER_Y,RECT_LOWER_X,RECT_LOWER_Y);g_arrBackGround = 1;g_arrBackGround = 1;g_arrBackGround

    22120

    SpringBoot项目traceId生成_日志打印

    image MDC MDC定义 Mapped Diagnostic Context,即:映射诊断环境。 MDC是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。 MDC 可以看成是一个与当前线程绑定的哈希表,可以往其中添加键值对。 MDC的使用方法 向MDC设置值:MDC.put(key, value); 从MDC中取值:MDC.get(key); 将MDC中的内容打印到日志中:%X{key}; 初始化TraceId并向MDC设置值 这里主要是利用切面,方法执行前设置MDC,方法执行后擦除MDC。 TraceIdInterceptor()); } } 日志打印配置pattern中配置traceId 与之前的相比只是添加了%X{TRACE_ID}, %X{***}是一个模板,中间属性名是我们使用MDC

    5430

    如何快速过滤出一次请求的所有日志?

    要解决这个问题,我们就得知道MDC的实现原理。 在创建MDCRunnable类时保存当前线程的MDC值,在执行run()方法时再将保存的MDC值拷贝到异步线程中去。 总结本文讲述了如何使用MDC工具来快速过滤一次请求的所有日志,并通过装饰器模式使得MDC工具在异步线程里也能生效。 有了MDC,再通过AOP技术对所有的切面植入requestId,就可以将整个系统的任意流程的日志过滤出来。 使用MDC工具,在开发自测阶段,可以极大地节省定位问题的时间,提升开发效率;在运维维护阶段,可以快速地收集相关日志信息,加快分析速度。

    46720

    Slf4j+Logback配置文件变量使用小记

    就是说SiftingAppender类可以根据MDC的值动态的构建其他的appender,由discriminator来指定MDC的Key和默认值。 根据https:logback.qos.chmanualmdc.html中的说明:   MDC operations such as put() and get() affect only the MDC The MDC in other threads remain unaffected. MDC put(), get()会影响当前线程和子线程的MDC值,但是不会响应其他线程。 再考虑上面的测试,那么其他线程应该是拿不到MDC test-variable的值的,打印的日志信息应该是不会输出到test-logger-PROG.log日志文件中去的,那它会输出到哪里呢? 根据对MDC的了解,MDC主要适用于须要在同一个进程中对不同的线程输出不同的日志格式,或输出到不同的文件这种场景,比如web项目,针对不同的用户请求,在日志中加入用户的信息,或者是不同的任务日志输出到不同的文件

    63780

    再不迁移到Material Design Components 就out啦

    MDC取代了设计支持库。本指南将向您展示如何迁移代码库,以便您可以使用新的属性,样式和小部件。精简的主题示例本指南使用了精简的应用程序来演示迁移过程。 MDC是使用AndroidX库构建的,因此必须进行迁移。要迁移到 AndroidX ,建议您遵循官方开发人员文档。 Android Studio中的 重构 > 迁移到 AndroidX 工具会将您的 Design Support Library 依赖重构成 MDC。 默认情况下,所有的 MDC 控件都将此可绘制对象当做背景,我们也可以考虑将它用作自定义 View 的背景。它可以处理形状主题、阴影、黑色主题等等。因此。 我们不建议使用 android:background 作为 MDC 控件的背景。因为它会覆盖 MaterialShapeDrawable。

    59530

    在Java项目中使用traceId跟踪请求全流程日志

    但在不改动原有输出语句的前提下自然需要日志框架的支持了,搜索的一番发现主流日志框架都提供了MDC功能。 MDCMDC 介绍 MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。 MDC 可以看成是一个与当前线程绑定的Map,可以往其中添加键值对。MDC 中包含的内容可以被同一线程中执行的代码所访问。当前线程的子线程会继承其父线程中的 MDC 的内容。 当需要记录日志时,只需要从 MDC 中获取所需的信息即可。MDC 的内容则由程序在适当的时候保存进去。对于一个 Web 应用来说,通常是在请求被处理的最开始保存这些数据。 简而言之,MDC就是日志框架提供的一个InheritableThreadLocal,项目代码中可以将键值对放入其中,然后使用指定方式取出打印即可。

    3.3K50

    扫码关注云+社区

    领取腾讯云代金券