slf4j的MDC

一、MDC概念

slf4j除了trace、debug、info、warn、error这几个日志接口外,还可以配合MDC将数据写入日志。换句话说MDC也是用来记录日志的,但它的使用方式与使用日志接口不同。

在使用日志接口时我们一般这么做

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行:

public static void initUUID(String uuid) {
        if(!StringUtils.isBlank(getUUID())) {
            LOGGER.debug("初始化uuid是发现uuid:{} 已存在,已重置", getUUID());
        }

        MDC.put("mdc_trace_id", StringUtils.isBlank(uuid)?createUUID():uuid);
    }

代码通过AOP记录了每次请求的traceId并使用变量"mdc_trace_id"记录,在日志配置文件里需要设置变量才能将"mdc_trace_id"输出到日志文件中。我以logback配置文件为例,看日志第6行%X{mdc_trace_id}:

<appender name="activexAppender" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="/opt/web/commerce/wf/logs/commerce.log" />
        <param name="DatePattern" value="'.'yyyy-MM-dd-HH'.log'" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="[%d{MM-dd HH:mm:ss SSS\} %-5p] [%X{mdc_trace_id}] [%t] %c{3\} - %m%n" />
        </layout>
        
    </appender>

三、MDC带来的好处

如果你的系统除了bug,老大让你查某一用户数据到日志里分析一下。如果没有MDC我猜此时此刻你应该处于雪崩状态。MDC恰到好处的让你能够实现快速定位线上问题与某一用户的操作行为。

如果你是个代码洁癖,封装了公司LOG的操作,并且将处理线程跟踪日志号也封装了进去,但只有使用了你封装日志工具的部分才能打印跟踪日志号,其他部分(比如hibernate、mybatis、httpclient等等)日志都不会体现跟踪号。当然我们可以通过linux命令来绕过这些困扰。
使代码简洁、日志风格统一

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,993评论 19 139
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,975评论 2 59
  • 星期天的早晨,旭旭一阵一阵的咳嗽,想睡懒觉都没有理由了。起床,让孩子喝了点水。一看还没有6点,我说让他再...
    旭旭齐齐阅读 378评论 0 3
  • 下午。 天低沉得压抑,灰蒙蒙的云不带一丝感情, 风混杂着热流, 让人胸口发闷。狂风裹着强劲的力量摧残着路...
    兆圭阅读 200评论 0 1
  • 城南老门东自从今年春节开街试迎客起就引起南京市民的关注,尤其是曾经居住在这里的老城南。因此,假如你去这里就会...
    jinlinglq阅读 269评论 0 0