MDC和NDC(log4j打印自定义属性)

    技术2025-08-10  13

    0.前言

    服务器日志打印时是按时间节点依次打印,在请求数过多时,很男凭借肉眼判断出一次请求的上下文。由此引出,如果每个request都带有唯一的标识,查询日志上下文时是不是就很方便.

    1.log4j自带的NDC和MDC

    1.1.NDC(Nested Diagnostic Context)

    NDC采用栈的机制存储上下文,线程独立的,子线程会从父线程拷贝上下文。: 方法:

    NDC.push(message);保存信息NDC.pop();删除栈顶消息NDC.remove();清除所有消息

    log4j配置:[%x]

    1.2.MDC(Mapped Diagnositc Context)

    MDC采用Map的方式存储上下文,线程独立的,子线程会从父线程拷贝上下文。 方法:

    MDC.put(key, value);保存信息MDC.get(key);获取消息MDC.remove(key);删除消息MDC.clear();清空消息

    log4j配置:%X{key} 或者 %X 输出全部消息

    2.使用

    一般来讲会把 唯一id在开始时加入上下文,在结束时删除,所以一般会配置两个filter,请求开始时push/put,请求结束时,pop,使用NDC时,要使用NDC.remove()方法。

    Processed: 0.010, SQL: 9