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. fastjosn在低版本丢字段问题

    简单的说: 对于java bean中有字段类似pId这种写法,特征是第一个字母小写,第二个字母大写,在eclipse中生成的getter setter方法是 getpId, setpId. 在低版本的 ...

  2. Android获取系统时间yyyyMMddHHmmssSSS

    代码改变世界 public String testTime1() throws ParseException { String DEFAULT_TIME_FORMAT = "yyyy-MM- ...

  3. 【bzoj2127】happiness 最大流

    happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 2579  Solved: 1245[Submit][Status][Discuss ...

  4. AngularJS实现TodoMVC

    一个小的to do list,界面如下 首先安装angular js,出现了无非安装到桌面的问题,安装到D盘了 npm install angular 文件结构: index.html: <!d ...

  5. 【13】react 之 redux(2)

    转载:http://www.cnblogs.com/MuYunyun/p/6530715.html 什么情况需要用redux? 用户的使用方式复杂 不同身份的用户有不同的使用方式(比如普通用户和管理员 ...

  6. 【11】 Express安装入门与模版引擎ejs

    前言 Express简介和安装 运行第一个基于express框架的Web 模版引擎 ejs express项目结构 express项目分析 app.set(name,value) app.use([p ...

  7. Fence(codeforces 232D)

    题意: 对于给定的a[1..n],定义区间[s,t]和[x,y]"匹配"当且仅当下列条件同时满足:1. t-s=y-x,即长度相同.3. t<x或s>y,即两区间没有交 ...

  8. 存储过程中set什么什么的讲解

    原文发布时间为:2008-09-27 -- 来源于本人的百度文章 [由搬家工具导入] set ansi_nulls [on/off] 与 set quoted_identifier [on/off] ...

  9. [LeetCode] Compare Version Numbers 字符串操作

    Compare two version numbers version1 and version2.If version1 > version2 return 1, if version1 &l ...

  10. PMI8940 PON (power on) trigger

    PMI8940 唯一的 PON input pin 是 SHDN_N, PM8937 的 VREG_L5 會接到 PMI8940 的 SHDN_N, PM8937 負責整個系統的 power on s ...