日志mdc
来源:互联网 发布:长者是谁 知乎 编辑:程序博客网 时间:2024/05/20 02:54
文章出自于:
http://www.cnblogs.com/sealedbook/p/6227452.html
slf4j中的MDC
slf4j中MDC是什么鬼
slf4j除了trace、debug、info、warn、error这几个日志接口外,还可以配合MDC将数据写入日志。换句话说MDC也是用来记录日志的,但它的使用方式与使用日志接口不同。
在使用日志接口时我们一般这么做
1
2
3
4
Logger LOG = LoggerFactory.getLogger(
"LOGNAME_OR_CLASS"
);
if
(LOG.isDebugEnabled()) {
LOG.debug(
"log debug"
);
}
MDC从使用方式上有些不同,我对它的理解是MDC可以将一个处理线程中你想体现在日志文件中的数据统一管理起来,根据你的日志文件配置决定是否输出。
比如以下但不限于以下场景可以考虑使用MDC来达到目的
- 我们想在日志中体现请求用户IP地址
- 用户使用http客户端的user-agent
- 记录一次处理线程的日志跟踪编号(这个编号目的是为了查询日志方便,结合grep命令能根据跟踪编号将本次的处理日志全部输出)
MDC的使用
org.slf4j.MDC我个人会用AOP或Filter或Interceptor这类工具配合使用,获得你希望输出到日志的变量并调用MDC.put(String key, String val),比如下面代码片段第5行:
1
2
3
4
5
6
7
8
9
10
11
12
13
@Around
(value =
"execution(* com.xx.xx.facade.impl.*.*(..))"
, argNames=
"pjp"
)
public
Object validator(ProceedingJoinPoint pjp)
throws
Throwable {
try
{
String traceId = TraceUtils.begin();
MDC.put(
"mdc_trace_id"
, traceId);
Object obj = pjp.proceed(args);
return
obj;
}
catch
(Throwable e) {
//TODO 处理错误
}
finally
{
TraceUtils.endTrace();
}
}
代码通过AOP记录了每次请求的traceId并使用变量"mdc_trace_id"记录,在日志配置文件里需要设置变量才能将"mdc_trace_id"输出到日志文件中。我以logback配置文件为例,看日志第10行%X{mdc_trace_id}:
1
2
3
4
5
6
7
8
9
10
11
12
<
appender
name="ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<
file
>${CATALINA_BASE}/logs/all.log</
file
>
<
rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<
fileNamePattern
>${CATALINA_BASE}/logs/all.%d{yyyy-MM-dd}.log</
fileNamePattern
>
<!-- keep 30 days' worth of history -->
<
maxHistory
>30</
maxHistory
>
</
rollingPolicy
>
<
encoder
charset="UTF-8">
<
pattern
>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - traceId:[%X{mdc_trace_id}] - %msg%n</
pattern
>
</
encoder
>
</
appender
>
MDC带来的好处
- 如果你的系统已经上线,突然有一天老板说我们增加一些用户数据到日志里分析一下。如果没有MDC我猜此时此刻你应该处于雪崩状态。MDC恰到好处的让你能够实现在日志上突如其来的一些需求
- 如果你是个代码洁癖,封装了公司LOG的操作,并且将处理线程跟踪日志号也封装了进去,但只有使用了你封装日志工具的部分才能打印跟踪日志号,其他部分(比如hibernate、mybatis、httpclient等等)日志都不会体现跟踪号。当然我们可以通过linux命令来绕过这些困扰。
- 使代码简洁、日志风格统一
阅读全文
0 0
- 日志mdc
- 使用MDC标注日志上下文
- MDC
- 日志线程与MDC中的Akka源
- log4j MDC用户操作日志追踪配置
- log4j MDC用户操作日志追踪配置
- 利用MDC在日志上增加用户或跟踪码
- MDC介绍 -- 一种多线程下日志管理实践方式
- MDC介绍 -- 一种多线程下日志管理实践方式
- MDC介绍 -- 一种多线程下日志管理实践方式
- 利用MDC在日志中打印访客ip
- MDC介绍 -- 一种多线程下日志管理实践方式
- 使用MDC为Logback slf4 日志记录线程ID,区分每次执行的会话日志
- 使用MDC为Logback slf4 日志记录线程ID,区分每次执行的会话日志
- LogBack sl4j 通过MDC实现日志记录区分用户Session[以Spring mvc为例] - 独木桥
- MDC 日志记录-Effective Logging in Java/JEE – Mapped Diagnostic Context
- 使用Spring MVC中的Interceptor和slf4j中的MDC实现日志归类标记
- (十四)SpringBoot使用AOP统一处理Web请求日志添加MDC
- 日常问题记录
- iOS10.1.1越狱插件推荐——SSHIcon
- 五大常用算法之四:回溯法
- js设计模式-- 装饰着模式
- 树--python
- 日志mdc
- php 常量及数据类型
- ArrayList、Vector、LinkedList的区别及其优缺点?
- solr之空间搜索剖析
- 一分钟了解"英语表达:观点/视角"
- 欢迎使用CSDN-markdown编辑器
- 关于多线程处理数据并发问题处理
- chapter12_2图片的通道分离与合并
- DenseNet