logback MDC(Mapped Diagnostic Context)与分布式系统的跟踪系统

logback MDC(Mapped Diagnostic Context)与分布式系统的跟踪系统

       logback官方文档中第8章Mapped Diagnostic Context给我们提供了一些分布式系统的跟踪系统实现的方法。

      logback设计的一个目标之一是对分布式应用系统的审计和调试。现实世界的分布式系统需要同时处理很多客户端的请求。在这样一个典型的多线程应用系统,不同的线程处理不同的客户端请求。

     那我们如何跟踪这些请求呢,目地想要知道请求响应的时间、请求成功与否、跟踪异常失败信息等等。要做到这些功能,我们必须给每个请求盖一个唯一的“邮戳”。这个“邮戳”必须跟随着请求线程的前行而存放一些有用的信息。

   logback框架中的MDC就是用来存放这些“邮戳”的。这个MDC的实现有点太普通,毕竟底层是个

<span style="font-size:18px;">  final InheritableThreadLocal<Map<String, String>> copyOnInheritThreadLocal = new InheritableThreadLocal<Map<String, String>>();
</span>

  (类:ch.qos.logback.classic.util.LogbackMDCAdapter)

      我们根据logback这个代码,我们可以用ThreadLocal保存我们自定义的一个object类,这个类保存了一些调用过程中重要的信息(当然根据是否需要跟踪应用内部线程中还有线程处理业务的信息,可以选择InheritableThreadLocal)。

 

  大多情况下,我们的应用要么是RPC服务,要么就是web应用。前端展示给用户的网页是应用请求的最开始端,当然这个一般情况下调用的是java web MVC框架服务。这个web MVC框架的主要任务那就是每当有请求时,必须自动保存我们想要保存的信息,logback这章文档也给出了最好的答案:servlet Filter

 

根据这个思想:我们代码大致如下:

ThreadLocal

public class UserServletFilter implements Filter {

   
  public void destroy() {
  }

  public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws IOException, ServletException {

    //这里要保存一些信息到我们<strong>ThreadLocal</strong>内。是否打印日志信息

    try {
      chain.doFilter(request, response);
    } finally {
      if (successful ) {
         //保存成功信息等等
      }
      //失败信息是否需要保存,是否打印日志信息
 }
  }

  public void init(FilterConfig arg0) throws ServletException {
  }
  

  
   
}

我们主要做的是保存什么信息到ThreadLocal,或者从请求信息那里得到什么信息然后保存在ThreadLocal里面,及日志的信息输出(日志的目的是收集日志进行分析)。

  一般情况下,我们的web不仅仅一个filter,所以我们要确保配置的这个filter一定要在其它之前声明。


    那还有一种应用,那就是提供RPC服务的应用,其实质也是web应用,只不过是代理模式封装了网络请求。

   我们主要做的就是在封装的网络请求那里要传递这个ThreadLocal对象信息,RPC服务端再解析出来。

  像Dubbo这个框架,自身实现了类似web的filter,很容易让你扩展,但类似Hessian框架,那就可能必须修改源码,自己实现了。

 

  其实,一些大公司已经有了这样的分布式跟踪应用,比如:

你可以看看它们的思想。毕竟大公司的应用调用关系很复杂,应对情况也比较多。本文只是根据MDC提出的很简单的实现思想。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dreamer who

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值