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

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

logback设计的一个目标之中的一个是对分布式应用系统的审计和调试。现实世界的分布式系统须要同一时候处理非常多client的请求。

在这样一个典型的多线程应用系统,不同的线程处理不同的client请求。

那我们怎样跟踪这些请求呢。目地想要知道请求响应的时间、请求成功与否、跟踪异常失败信息等等。

要做到这些功能,我们必须给每一个请求盖一个唯一的“邮戳”。

这个“邮戳”必须尾随着请求线程的前行而存放一些实用的信息。

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,非常easy让你扩展,但类似Hessian框架,那就可能必须改动源代码,自己实现了。

 

事实上,一些大公司已经有了这种分布式跟踪应用,比方:

你能够看看它们的思想。毕竟大公司的应用调用关系非常复杂,应对情况也比較多。本文仅仅是依据MDC提出的非常easy的实现思想。

logback MDC(Mapped Diagnostic Context)与分布式系统的跟踪系统的更多相关文章

  1. Dapper,大规模分布式系统的跟踪系统--转

    原文地址:http://bigbully.github.io/Dapper-translation/ 概述 当代的互联网的服务,通常都是用复杂的.大规模分布式集群来实现的.互联网应用构建在不同的软件模 ...

  2. Dapper,大规模分布式系统的跟踪系统

    概述 当代的互联网的服务,通常都是用复杂的.大规模分布式集群来实现的.互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发.可能使用不同的编程语言来实现.有可能布在了几千台服务器 ...

  3. MDC的使用(Mapped Diagnostic Context)的使用

    通常我们可能会有大量的任务需要提交提交到线程池执行,但是此时如果不对日志添加唯一标识进行区分的话回到错乱一坨无法进行查看.因此可以对每一天日志添加唯一的标识,例如使用userid作为日志的唯一标志.这 ...

  4. logback MDC 使用

    有时候想在logback日志中打印请求IP.流水号这些信息,可以通过MDC(Mapped Diagnostic Contexts)实现: MDC.put("requestNo", ...

  5. Logback MDC

    Mapped Diagnostic Contexts (MDC)   (译:诊断上下文映射) Logback的设计目标之一是审计和调试复杂的分布式应用程序.大多数实际的分布式系统需要同时处理来自多个客 ...

  6. 基于spring boot 和MDC实现 同一笔记录的日志跟踪实现--1.filter

    同一个项目中,一般包含controller/servlet.service.dao等.1笔记录的日志贯穿于controller.service.dao中,在并发情况下,那如何找出该笔日志? 可通过以下 ...

  7. Net分布式系统之一:系统整体框架介绍

    一.设计目的 从事.Net平台开发系统已有8年多了,一直思考搭建.Net分布式系统架构.基于window平台搭建的大型分布式系统不多,之前了解过myspace.stackoverflow等大型网站.搭 ...

  8. DLT(Diagnostic Log and Trace)嵌入式系统程序运行记录

    http://blog.csdn.net/yanlinembed/article/details/49837975 DLT的使用有属于Application范畴与Context范畴.在使用DLT时,需 ...

  9. Log4j 与 Logback的ConversionPattern对比

    为了能将log4j的配置无缝转到logback,需要了解其中ConversionPattern的差异,以下是对比表格,内容来自: log4j官网 logback官网 其中可能需要转换的地方主要有两块: ...

随机推荐

  1. ArrayList以及Map小练

    ArrayList常用方法 public static void main(String[] args) { List list = new ArrayList(); List list1 = new ...

  2. Python+Selenium练习篇之20-处理Alert弹窗

    本文来介绍如何通过Selenium方法去处理网页Alert弹窗,和处理iframe类似,都是通过switch_to方法.这里还是没有找到合适的alert弹窗网站,我们就自己创建一个吧,前面文章介绍了如 ...

  3. [超级基础]Web安全之SQL注入由浅入深(?)

    前言 断断续续看Web安全到现在了,感觉对很多基础知识还是一知半解,停留在模糊的层次.所以准备系统总结一下. Sql注入我以前一直不以为然,一是现在能sql的站确实很少,二是有像sqlmap的工具可以 ...

  4. Visual C++网络五子棋游戏源代码

    说明:网络对战版的五子棋,VC++游戏源码,带音乐,可设置网络最终网络下棋,通过源代码你将了解到设置菜单状态.服务器端口申请.客户机申请连接.发送数据.游戏编写.监听和使用套接字.主菜单对象定义等基础 ...

  5. 关于在smarty中实现省市区三级联动

    刚开始接触php,,其实对于一些比较深入的东西还不是很了解,就像是这次的省市区联动,都是用三张表为基础编码的,原谅我的无知,谢谢. 接下来就是编码部分了: <?php require('./sm ...

  6. HDU 4027 Can you answer these queries?(线段树区间开方)

    Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65768/65768 K ...

  7. Activity启动创建 (AcitivtyManageService,ActivityThread,Activity)

    ActivityThead,ActivityManagerService,Activity  <<Android内核剖析>>中有一章节专门介绍 Activity框架和管理结构A ...

  8. [暑假集训--数论]hdu1019 Least Common Multiple

    The least common multiple (LCM) of a set of positive integers is the smallest positive integer which ...

  9. Java语法糖(二)

    语法糖之四:内部类 内部类:顾名思义,在类的内部在定义一个类.内部类仅仅是编译时的概念,编译成字节码后,内部类会生成单独的Class文件. 四种:成员内部类.局部内部类.匿名内部类.静态内部类. 1. ...

  10. [Visual Studio] 确定项目是用Visual Studio哪个版本开发的

    用记事本打开 .sln文件,在第3行就有: