如何在Logback中配置单Pattern根据MDC键存在性输出固定宽度字段
问题原因
Logback 的 MDC 转换器默认值语法mdc{key:-default}仅支持字面量默认值,不会递归解析嵌套的格式表达式,因此你写在:-后的%3.-3mdc{section}这类内容会被直接作为普通字符串输出,无法触发二次解析。
可行解决方案
方案1:使用Logback内置条件表达式(无代码侵入)
Logback 1.2.9及以上版本支持在Pattern中直接使用%if条件判断,可完美适配你的需求,配置如下:
<pattern>%d{HH:mm} [%thread] %if(%mdc{action} != null) %12.-12mdc{action} %else %3.-3mdc{section} %3.-3mdc{subsection} %3.-3mdc{subsubsection} %end - %msg%n</pattern>
该写法无需额外开发,配置简单,优先推荐使用。
方案2:自定义格式转换器(全版本兼容)
如果使用的Logback版本低于1.2.9,或者后续需要更灵活的前缀规则扩展,可以通过自定义转换器实现:
- 编写转换器类:
import ch.qos.logback.classic.pattern.ClassicConverter; import ch.qos.logback.classic.spi.ILoggingEvent; import org.slf4j.MDC; public class MdcPrefixConverter extends ClassicConverter { @Override public String convert(ILoggingEvent event) { String action = MDC.get("action"); // 优先返回固定12位的action值 if (action != null) { return String.format("%12.12s", action); } // 拼接三级section值,总长度对齐12位 String section = MDC.get("section") == null ? "" : MDC.get("section"); String subsection = MDC.get("subsection") == null ? "" : MDC.get("subsection"); String subsubsection = MDC.get("subsubsection") == null ? "" : MDC.get("subsubsection"); String sectionStr = String.format("%3.3s %3.3s %3.3s", section, subsection, subsubsection); return String.format("%12.12s", sectionStr); } }
- 在Logback配置中注册转换器并使用:
<configuration> <!-- 注册自定义转换器,conversionWord为自定义的格式关键字 --> <conversionRule conversionWord="customPrefix" converterClass="com.yourpackage.MdcPrefixConverter" /> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm} [%thread] %customPrefix - %msg%n</pattern> </encoder> </appender> <!-- 其余日志配置 --> </configuration>
内容的提问来源于stack exchange,提问作者HugoRune
相关产品推荐
相关产品推荐

