You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Log4j2中避免MDC值缺失时打印空括号?

Log4j2 实现MDC键缺失时不显示空括号的方案

针对你遇到的MDC键未设置时日志输出空括号的问题,有两种常用解决方案:

方法一:使用内置条件格式化语法

Log4j2 2.10.0及以上版本支持在日志模式中使用条件判断和空值检查,直接修改LOG_PATTERN即可实现需求:

property.LOG_PATTERN=%d{yyyy-MM-dd HH:mm:ss.SSS} %if{%notEmpty{%X{customer.name}}}{[%X{customer.name}]%if{%notEmpty{%X{correlation.id}}}{ }}%if{%notEmpty{%X{correlation.id}}}{[%X{correlation.id}]} %5p [%t] %c{1.} : %m%n

效果说明

  • 两个MDC键都存在:2025-01-02 10:15:30.123 [customer1] [corr-id-123] INFO [main] MyClass : This is a log message
  • 仅customer.name存在:2025-01-02 10:15:30.123 [customer1] INFO [main] MyClass : This is a log message
  • 仅correlation.id存在:2025-01-02 10:15:30.123 [corr-id-123] INFO [main] MyClass : This is a log message
  • 两个键都不存在:2025-01-02 10:15:30.123 INFO [main] MyClass : This is a log message

这种方式无需编写额外代码,直接通过配置即可实现,适合大多数场景。

方法二:自定义Pattern转换器

如果需要更复杂的上下文处理逻辑,可以自定义一个Log4j2的Pattern转换器:

步骤1:编写转换器类

import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
import org.apache.logging.log4j.core.pattern.PatternConverter;

@Plugin(name = "MdcContextConverter", category = PatternConverter.CATEGORY)
public class MdcContextConverter extends LogEventPatternConverter {

    private MdcContextConverter(String[] options) {
        super("MdcContext", "mdcContext");
    }

    public static MdcContextConverter newInstance(String[] options) {
        return new MdcContextConverter(options);
    }

    @Override
    public void format(LogEvent event, StringBuilder toAppendTo) {
        StringBuilder sb = new StringBuilder();
        String customerName = event.getContextMap().get("customer.name");
        String correlationId = event.getContextMap().get("correlation.id");

        if (customerName != null && !customerName.isBlank()) {
            sb.append("[").append(customerName).append("]");
        }
        if (correlationId != null && !correlationId.isBlank()) {
            if (sb.length() > 0) {
                sb.append(" ");
            }
            sb.append("[").append(correlationId).append("]");
        }
        if (sb.length() > 0) {
            toAppendTo.append(" ").append(sb);
        }
    }
}

步骤2:在配置中使用转换器

修改日志模式,直接引用自定义的转换器:

property.LOG_PATTERN=%d{yyyy-MM-dd HH:mm:ss.SSS} %MdcContextConverter %5p [%t] %c{1.} : %m%n

这种方式灵活性更高,可根据业务需求扩展更多MDC字段的处理逻辑。

内容的提问来源于stack exchange,提问作者Rahul verma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 05:33:17