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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC; import java.util.Map;
import java.util.concurrent.*; import static java.util.concurrent.TimeUnit.SECONDS; public class LogMDC { private static final Logger logger = LoggerFactory.getLogger("logic"); // 使用logic打印线程池执行任务的日志 public static void main(String[] args) {
MDC.put("sessionId", "sessionId_Value");
MDC.put("userName", "userName_Value"); ExecutorService executors = Executors.newFixedThreadPool(4);
Future<Integer> f = executors.submit(new TaskMDC()); try {
System.out.println(f.get(2, SECONDS));
} catch (InterruptedException e) {
e.printStackTrace();
logger.error(e.getMessage());
} catch (ExecutionException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
} // You can put values in the MDC at any time. Before anything else
// we put the first name
MDC.put("first", "Dorothy"); // We now put the last name
MDC.put("last", "Parker"); // The most beautiful two words in the English language according
// to Dorothy Parker:
logger.info("Check enclosed.");
logger.debug("The most beautiful two words in English."); MDC.put("first", "Richard");
MDC.put("last", "Nixon");
logger.info("I am not a crook.");
logger.info("Attributed to the former US president. 17 Nov 1973."); } static class TaskMDC implements Callable<Integer> { private Map<String, String> map; public TaskMDC() {
this.map = MDC.getCopyOfContextMap();
} @Override
public Integer call() throws Exception {
if (map != null) {
MDC.setContextMap(map);
} // The most beautiful two words in the English language according
// to Dorothy Parker:
logger.info("Call Thread Check enclosed.");
logger.debug("Call Thread The most beautiful two words in English."); MDC.put("first", "Richard");
MDC.put("last", "Nixon");
logger.info("Call Thread I am not a crook.");
logger.info("Call Thread Attributed to the former US president. 17 Nov 1973.");
return 2;
}
}
}

  

log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss.SSS} - %X{userName} - %m%n"/>
</layout>
</appender>
<appender name="error" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="./logs/error.log"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<param name="threshold" value="error"/>
<param name="append" value="true"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] - %X{userName} - %m%n"/>
</layout>
</appender>
<appender name="logic" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="./logs/logic.log"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<param name="threshold" value="info"/>
<param name="append" value="true"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] - %X{userName} - %m%n"/>
</layout>
</appender>
<appender name="trace" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="./logs/trace.log"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<param name="threshold" value="info"/>
<param name="append" value="true"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] - %X{userName} - %m%n"/>
</layout>
</appender>
<logger name="traceLog" additivity="false">
<level value="info"/>
<appender-ref ref="trace"/>
</logger>
<root>
<level value="info"/>
<appender-ref ref="console"/>
<appender-ref ref="logic"/>
<appender-ref ref="error"/>
</root>
</log4j:configuration>

  

pom:

       <dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>

  

MDC的使用(Mapped Diagnostic Context)的使用的更多相关文章

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

    logback MDC(Mapped Diagnostic Context)与分布式系统的跟踪系统 logback官方文档中第8章Mapped Diagnostic Context给我们提供了一些分布 ...

  2. 在SpringBoot项目中添加logback的MDC

    在SpringBoot项目中添加logback的MDC     先看下MDC是什么 Mapped Diagnostic Context,用于打LOG时跟踪一个“会话“.一个”事务“.举例,有一个web ...

  3. MDC是什么鬼?用法、源码一锅端

    近期用到阿里的一款开源的数据同步工具 Canal,不经意之中看到了 MDC 的用法,而且平时项目中也多次用到 MDC,趁机科普一把. 通过今天的分享,能让你轻松 get 如下几点,绝对收获满满. a) ...

  4. 【原】MDC日志链路设计

    背景 我们项目中现有日志系统,采用的是slf4j+logback这套日志组件,也是Java生态里面比较常用的一个日志组件,但是随着分布式的演进,这套组件明显存在以下几个问题: 1.各种无关日志穿行其中 ...

  5. 通过源码理解Spring中@Scheduled的实现原理并且实现调度任务动态装载

    前提 最近的新项目和数据同步相关,有定时调度的需求.之前一直有使用过Quartz.XXL-Job.Easy Scheduler等调度框架,后来越发觉得这些框架太重量级了,于是想到了Spring内置的S ...

  6. 微服务架构 | 10.1 使用 Sleuth 追踪服务调用链

    目录 前言 1. Sleuth 基础知识 1.1 Sleuth 原理 2. 在服务中使用 Sleuth 追踪 2.1 引入 pom.xml 依赖文件 2.2 查看日志信息 最后 前言 参考资料: &l ...

  7. log4j中的MDC和NDC

    NDC和MDC NDC(Nested Diagnostic Context)和MDC(Mapped Diagnostic Context)是log4j种非常有用的两个类,它们用于存储应用程序的上下文信 ...

  8. Log4j NDC MDC

    NDC(Nested Diagnostic Context)和MDC(Mapped Diagnostic Context)是log4j种非常有用的两个类,它们用于存储应用程序的上下文信息(contex ...

  9. log4j MDC用户操作日志追踪配置

    一.MDC介绍 MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能.某些应用程序采用多线程的方式 ...

随机推荐

  1. 发布webservice之后调用不通

    在websrvice发布文件的webconfig中加入 <httpRuntime maxRequestLength="102400" />  <webServic ...

  2. Shiro学习总结(1)——Apache Shiro简介

    1.1  简介 Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比springSecurity,可能没有Spring Securit ...

  3. webpack4 系列教程(五): 处理CSS

    这节课讲解webpack4中打包css的应用.v4 版本和 v3 版本并没有特别的出入. >>> 本节课源码 >>> 所有课程源码 教程所示图片使用的是 githu ...

  4. C#中的out、ref、params详解

    out参数: 如果你在一个方法中,返回多个相同类型的值的时候,可以考虑返回一个数组.但是,如果返回多个不同类型的值的时候,返回数组就不行了,那么这个时候,我们可以考虑使用out参数.out参数就侧重于 ...

  5. java 多线程简单例子

    实现线程的方式是一,继承Thread类,重写父类的run()方法 二,实现接口Runnable中的run()方法. 下面是简单的例子 例子1:银行存取钱问题 package com.direct.de ...

  6. git与vscode连接的一种简单方式

    首先你得安装git,如果你还没安装git,推荐你一个视频git的下载与安装,这套视频包含VS code和git的基本使用,当你看完它,就可以不看我的这篇博客了. 废话不多说,直接进入正题: 首先进入g ...

  7. HTML5的DeviceOrientation实现微信摇一摇功能

    在HTML5中,DeviceOrientation特性所提供的DeviceMotion事件封装了设备的运动传感器时间,通过改时间可以获取设备的运动状态.加速度等数据(另还有deviceOrientat ...

  8. 【代码笔记】Web-ionic tab(选项卡)

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  9. 使用katalon自带Spy功能获取/验证控件Selector、XPath

    背景 最近刚接手一个katalon编写的UI自动化项目,页面最近刚改版,已有用例很多查找元素失败.了解到katalon元素定位支持xpath,所以直接使用chrome开发者工具打开目标页面+获取xpa ...

  10. 如何将 asp.net core 应用进行 docker 容器部署

    asp.net core 部署在 docker 容器中比较简单,但常因asp.net core程序发布的问题造成容器无法正常启动.现在把详细的操作的步骤记录如下: 一.asp.net core web ...