MDC的使用(Mapped Diagnostic Context)的使用
通常我们可能会有大量的任务需要提交提交到线程池执行,但是此时如果不对日志添加唯一标识进行区分的话回到错乱一坨无法进行查看。因此可以对每一天日志添加唯一的标识,例如使用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)的使用的更多相关文章
- logback MDC(Mapped Diagnostic Context)与分布式系统的跟踪系统
logback MDC(Mapped Diagnostic Context)与分布式系统的跟踪系统 logback官方文档中第8章Mapped Diagnostic Context给我们提供了一些分布 ...
- 在SpringBoot项目中添加logback的MDC
在SpringBoot项目中添加logback的MDC 先看下MDC是什么 Mapped Diagnostic Context,用于打LOG时跟踪一个“会话“.一个”事务“.举例,有一个web ...
- MDC是什么鬼?用法、源码一锅端
近期用到阿里的一款开源的数据同步工具 Canal,不经意之中看到了 MDC 的用法,而且平时项目中也多次用到 MDC,趁机科普一把. 通过今天的分享,能让你轻松 get 如下几点,绝对收获满满. a) ...
- 【原】MDC日志链路设计
背景 我们项目中现有日志系统,采用的是slf4j+logback这套日志组件,也是Java生态里面比较常用的一个日志组件,但是随着分布式的演进,这套组件明显存在以下几个问题: 1.各种无关日志穿行其中 ...
- 通过源码理解Spring中@Scheduled的实现原理并且实现调度任务动态装载
前提 最近的新项目和数据同步相关,有定时调度的需求.之前一直有使用过Quartz.XXL-Job.Easy Scheduler等调度框架,后来越发觉得这些框架太重量级了,于是想到了Spring内置的S ...
- 微服务架构 | 10.1 使用 Sleuth 追踪服务调用链
目录 前言 1. Sleuth 基础知识 1.1 Sleuth 原理 2. 在服务中使用 Sleuth 追踪 2.1 引入 pom.xml 依赖文件 2.2 查看日志信息 最后 前言 参考资料: &l ...
- log4j中的MDC和NDC
NDC和MDC NDC(Nested Diagnostic Context)和MDC(Mapped Diagnostic Context)是log4j种非常有用的两个类,它们用于存储应用程序的上下文信 ...
- Log4j NDC MDC
NDC(Nested Diagnostic Context)和MDC(Mapped Diagnostic Context)是log4j种非常有用的两个类,它们用于存储应用程序的上下文信息(contex ...
- log4j MDC用户操作日志追踪配置
一.MDC介绍 MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能.某些应用程序采用多线程的方式 ...
随机推荐
- C#检测是否联网
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...
- WebFrom 【文件上传】
文件上传 准备工作1.文件上传的页面2.上传文件要保存的文件夹 1.只要将文件传上来就行 //1.获取要上传的文件,并且知道要上传到服务器的路径 string s = "Uploads/aa ...
- Java坦克大战(一)
接下来的几篇博客,想记录一下通过学习坦克大战项目来循序渐进的学习Java基础.主要是为了巩固基础知识,当然学习编程重要的还是多敲,问题通常是在敲代码的过程中发现的,积累也是在敲代码中寻求的经验.这个坦 ...
- 【RabbitMQ】4、RabbitMQ几种Exchange 模式
AMQP协议中的核心思想就是生产者和消费者隔离,生产者从不直接将消息发送给队列.生产者通常不知道是否一个消息会被发送到队列中,只是将消息发送到一个交换机.先由Exchange来接收,然后Exchang ...
- 【IDEA&&Eclipse】2、从Eclipse转移到IntelliJ IDEA一点心得
本人使用IntelliJ IDEA其实并不太久,用了这段时间以后,觉得的确很是好用.刚刚从Eclipse转过来的很多人开始可能不适应,我就把使用过程中的一些经验和常用功能分享下,当然在看这篇之前推荐你 ...
- MVC中Controller与View中间的数据传递的常用方法
这几天正在学习MVC,顺便就将自己每天的学习心得记录下来与大家分享一下吧! 在MVC中,Controller与View之间传递数据是很频繁的事情,所以在这里就总结一下我自己在学习中使用的几种常用的方法 ...
- Nhibernate学习的第二天
Fluent-Nhibernate 网站:http://www.fluentnhibernate.org/ 使用NuGet下载Fluent-Nhibernate. 1.创建实体类 2.创建实体类映 ...
- 初学HTML-9
详情和概要标签:利用summary标签来描述概要信息,利用details标签来描述详情信息. 默认情况下是折叠显示. 格式:<details> <summary>概要信息< ...
- 【代码笔记】Web-ionic单选框
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 【读书笔记】iOS-iOS开发之iOS程序偏好设置(Settings Bundle)的使用
在Android手机上, 在某个程序里,通过按Menu键,一般都会打开这个程序的设置,而在iOS里,系统提供了一个很好的保存程序设置的机制.就是使用Settings Bundle. 在按了HOME键的 ...