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. Python+Selenium练习篇之17-断言页面标题

    继续来介绍一个Selenium中页面title断言方法. 相关脚本代码如下: # coding=utf-8 import time from selenium import webdriver dri ...

  2. [问题解决]NotImplementedError 错误原因:子类没有实现父类要求一定要实现的接口

    NotImplementedError: 子类没有实现父类要求一定要实现的接口. 在面向对象编程中,父类中可以预留一个接口不实现,要求在子类中实现.如果一定要子类中实现该方法,可以使用raise No ...

  3. s if标签

    字符串N一定要用“”双引号包含,从test的包含则用单引号 ‘ ’,如果相反,则不能正确判断该属性是否与该字符串相等. 正确:<s:if test='activityBean.searchFor ...

  4. 【转】Unity3d实现物体围绕某一点进行旋转

    1,让一个物体围绕某一点旋转,有几种方法?分别是什么? 答:在这个点处放一个空物体B,则问题变为A绕着B旋转, 方法1:B不动,A挂脚本实现transform的RotateAround(vector3 ...

  5. [POJ2942][LA3523]Knights of the Round Table

    [POJ2942][LA3523]Knights of the Round Table 试题描述 Being a knight is a very attractive career: searchi ...

  6. 【bzoj2946】[Poi2000]公共串 后缀自动机

    [Poi2000]公共串 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1386  Solved: 620[Submit][Status][Discus ...

  7. zabbix3.4 源码部署

    centos6.8  系统    zabbix3.4.9   msyql5.7.22   php5.6.24  在centos6上面源码部署zabbix.3.4 问题比较多,需要花不少时间去解决,建议 ...

  8. js本地对象的操作

    1 String对象方法: concat 将两个或多个字符的文本组合起来,返回一个新的字符串. var a = "hello"; var b = ",world" ...

  9. 【转】Nodejs学习笔记(一)--- 简介及安装Node.js开发环境

    目录 学习资料 简介 安装Node.js npm简介 开发工具 Sublime Node.js开发环境配置 扩展:安装多版本管理器 学习资料 1.深入浅出Node.js http://www.info ...

  10. java中的序列化与反序列化,还包括将多个对象序列化到一个文件中

    package Serialize; /** * Created by hu on 2015/11/7. */ //实现序列化必须实现的接口,这就是一个空接口,起到标识的作用 import java. ...