log4j中的%x ---NDC,%X---MDC

即%x

NDC.clear();
NDC.push(this.toString());
%X{first} %X{last}
MDC.put("first", "Dorothy"); Logger logger = LoggerFactory.getLogger(SimpleMDC.class); // We now put the last name MDC.put("last", "Parker");

mdc 实际上是一个封装了ThreadLocal变量的一个类。

官方实现:mdc 包含了一个ThreadLocalMap   因为  ThreadLocalMap extends InheritableThreadLocal  所以他有特性1:可以向下传递,2.本身处理的是hashTable 。

  final static MDC mdc = new MDC();

  static final int HT_SIZE = 7;

  boolean java1;

  Object tlm;

  private Method removeMethod;

  private
MDC() {
java1 = Loader.isJava1();
if(!java1) {
tlm = new ThreadLocalMap();
} try {
removeMethod = ThreadLocal.class.getMethod("remove", null);
} catch (NoSuchMethodException e) {
// don't do anything - java prior 1.5
}
}

NDC

一层一层深入 发现也是包含了一个 ThreadLocal,由于它不具有InheritableThreadLocal 的特性,所以开启新线程的时候,需要手动重新设置。

public static void push(String message) {
ThreadContext.push(message);
}
    public void push(String message) {
if (this.useStack) {
this.add(message);
}
}
    public boolean add(String s) {
if (!this.useStack) {
return false;
} else {
MutableThreadContextStack copy = this.getNonNullStackCopy();
copy.add(s);
copy.freeze();
stack.set(copy);
return true;
}
}
public class DefaultThreadContextStack implements ThreadContextStack {
private static final long serialVersionUID = 5050501L;
private static final ThreadLocal<MutableThreadContextStack> stack = new ThreadLocal();
private final boolean useStack;

开启线程时操作

        final String s=NDC.get();
final Map<String, String> mdcdata = MDCUtil.peekMap();
ThreadPoolUtil.ex.execute(new Runnable() {
@Override
public void run() {
MDCUtil.set(mdcdata);
NDC.push(s);
alarmInfoSao.sendAlarmEventMsg(alarmEventDTO);
}
});

MDC 输出线程信息帮助定位问题的更多相关文章

  1. log4j2自定义输出线程环境信息

    在配置日志的输出格式的时候,我们可以按照内置的规则输出日志,但是有时候需要及时输出我们自定义的信息,这时需要借助ThreadContext类. ThreadContext类类似于MDC和NDC,它是一 ...

  2. (转)linux进程 linux线程 信息查看 ps top pstree

    原文:https://blog.csdn.net/xiaoliuliu2050/article/details/81912202 https://blog.csdn.net/u011734144/ar ...

  3. 【旧文章搬运】ZwQuerySystemInformation枚举进线程信息

    原文发表于百度空间,2008-10-15========================================================================== 很古老的东 ...

  4. 前端知识体系:JavaScript基础-原型和原型链-理解JavaScript的执行上下文栈,可以应用堆栈信息快速定位问题

    理解JavaScript的执行上下文栈,可以应用堆栈信息快速定位问题(原文文档) 1.什么是执行上下文: 简而言之,执行上下文就是当前JavaScript代码被解析和执行时所在环境的抽象概念,Java ...

  5. 获取系统中所有进程&线程信息

    读书笔记--[计算机病毒解密与对抗] 目录: 遍历进程&线程程序 终止进程 获取进程信息 获取进程内模块信息 获取进程命令行参数 代码运行环境:Win7 x64 VS2012 Update3 ...

  6. 创建如下三个类:(People类中的三个方法分别输出一些信息,ChinaPeople 和AmericanPeople类重写父类的三个方法)。

    创建如下三个类:(People类中的三个方法分别输出一些信息,ChinaPeople 和AmericanPeople类重写父类的三个方法). ackage com.chuoji.text01; pub ...

  7. js操作dom---创建一个域来输出调试信息

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  8. 在MFC中,使用控制台Console输出调试信息

    1.在MFC的应用类的InitInstance()函数里添加: AllocConsole(); 有时候需要调整这行代码在InitInstance函数的位置 2.继续添加以下代码 freopen(&qu ...

  9. 查看android app 线程信息的命令

    参考:https://my.oschina.net/zhiweiofli/blog/138454 ps | grep 'joyodream' 找到 app 的pid: joyodream为包名的一部分 ...

随机推荐

  1. Java-POJ1005-I Think I Need a Houseboat

    盗用的翻译,哈哈哈!白嫖就完事了. 题目: 密西西比河岸某处陆地因为河水侵蚀,每年陆地面积都在减少,每年减少50平方英里,减少的陆地面积呈半圆形,即该半圆形面积以每年50平方英里的速度增长.在第一年初 ...

  2. 10day 系统的selinux服务程序优化

    selinux服务对root用户权限进行控制 很多企业中:selinux服务默认关闭 centos6==centos7 临时关闭: 检查确认: getenforce --- 确认selinux服务是否 ...

  3. JS实现点击table中任意元素选中

    上项目开发,忙的焦头烂额,博客也没咋更新了. 昨天老师提了个需求,简单的小例子,选择tr中任一行选中tr,觉得很有意思,记录一下: 上代码 <!DOCTYPE html> <html ...

  4. 阻塞队列BlockingQueue之LinkedBlokingQueue

    1.简介 LinkedBlokingQueue 是链表实现的有界阻塞队列,此队列的默认和最大长度为 Integer.MAX_VALUE.此队列按照先进先出的原则对元素进行排序.ArrayList和Ar ...

  5. <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"/>

    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1, ...

  6. HTTP状态码详解(上)

    HTTP状态码的英文为 HTTP Status Code.下面是常见的HTTP状态码: 200 - 请求成功 301 - 资源(网页等)被永久转移到其它URL 404 - 请求的资源(网页等)不存在 ...

  7. linux文件或文件夹常见操作,排查部署在linux上程序问题常用操作

    创建文件夹 mkdir [-p] DirName [ 在工作目录下,建立一个名为 A 新的子目录 : mkdir A 在工作目录下的 B目录中,建立一个名为 T 的子目录:   若 B 目录不存在,则 ...

  8. 「模板」AC自动机

    目录 说明 普通版本 询问更改版 拓扑优化版本 说明 这篇博客只挂模板,具体分析请膜拜大佬 hyfhaha 大佬. 普通版本 题目传送门 #include<cstdio> #include ...

  9. 记录一下自己搭建springboot+mybatis+druid 多数据源的过程

    前言  上次的一个项目(springboot+mybatis+vue),做到后面的时间发现需要用到多数据源.当时没有思路..后来直接用了jdbc来实现.这几天不是很忙,所以决定自己再搭建一次.不多说, ...

  10. saas的资料

    互联网时代的软件革命-SaaS架构设计.叶伟.扫描版 提取码:jd5c 让云落地  云计算服务模式(SAAS.PAAS和IAAS)设计决策--Michael J.Kavis著提取码:ut24