如何在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
相关产品推荐
相关产品推荐

