Logback支持通过继承Converter或ClassicConverter实现自定义占位符,前者用于无参扩展(如%tid),后者支持参数化(如%tid{prefix});需在logback.xml中用conversionRule注册,并确保类在classpath下、无耗时操作。

Logback 允许你通过自定义 Converter 来扩展日志格式中占位符(如 %X{key}、%mdc、%ex 等)的行为,从而输出任意逻辑处理后的文本。核心是继承 ch.qos.logback.core.pattern.Converter 并注册到 PatternLayout 中。
编写自定义 Converter 类
你需要实现一个继承 Converter 的类,并重写 convert(ILoggingEvent) 方法:
- 泛型类型通常为
ILoggingEvent,代表当前日志事件 - 在
convert()中可访问 MDC、异常、日志级别、线程名、上下文属性等 - 返回字符串即为该占位符最终输出内容
示例:输出「带前缀的线程 ID」
public class PrefixedThreadIdConverter extends Converter<iloggingevent> {
@Override
public String convert(ILoggingEvent event) {
String threadName = event.getThreadName();
return "TID[" + (threadName != null ? threadName : "unknown") + "]";
}
}</iloggingevent>在 logback.xml 中注册并使用
用 <conversionrule></conversionrule> 声明新占位符名称与 Converter 类的映射,之后就能在 pattern 中像内置转换器一样使用:
-
conversionWord是你在 pattern 中写的占位符名(如%tid) -
converterClass必须是完整类名,且该类要有无参构造函数
<configuration><conversionrule conversionword="tid" converterclass="com.example.PrefixedThreadIdConverter"></conversionrule><p><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%tid] %-5level %logger{36} - %msg%n</pattern></encoder></appender></p>
<p><root level="INFO"><appender-ref ref="CONSOLE"></appender-ref></root></p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill3430" title="Alibabacloud Sdk Client Initialization For Java"><img
src="https://img.php.cn/upload/skill/000/000/081/178955835420587.jpg" alt="Alibabacloud Sdk Client Initialization For Java" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill3430" title="Alibabacloud Sdk Client Initialization For Java" class="overflowclass">Alibabacloud Sdk Client Initialization For Java</a>
<p class="overflowclass">在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。</p>
</div>
<a rel="nofollow" href="/xiazai/skill3430" title="Alibabacloud Sdk Client Initialization For Java" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div></configuration>运行后某行日志可能显示为:14:22:03.123 [TID[main]] INFO c.e.App - Hello
进阶:支持参数化(如 %tid{prefix})
若想让 Converter 接收配置参数(例如 %tid{DEBUG}),需额外做两步:
- 继承
ClassicConverter(而非普通Converter),它提供getFirstOption()等方法读取 pattern 中花括号内的参数 - 重写
start()方法解析选项(Logback 在初始化时调用)
示例:动态前缀的线程转换器
public class ParametricThreadIdConverter extends ClassicConverter {
private String prefix = "TID";
<pre class="brush:php;toolbar:false;">@Override
public void start() {
String opt = getFirstOption();
if (opt != null && !opt.trim().isEmpty()) {
prefix = opt.trim();
}
super.start();
}
@Override
public String convert(ILoggingEvent event) {
return prefix + "[" + event.getThreadName() + "]";
}}
对应 XML 使用:%tid{TRACE} → 输出 TRACE[main]
常见注意事项
- 自定义 Converter 类必须放在 classpath 下,且能被 Logback 的 ClassLoader 加载
- 类不能有编译期依赖 Logback 私有 API(如
ch.qos.logback.core.spi内部类),否则可能因版本升级失效 - 避免在
convert()中执行耗时操作(如网络调用、磁盘 IO),否则拖慢日志性能 - 若需访问 MDC 或上下文属性,直接调用
event.getMDCPropertyMap()或event.getLoggerContextVO().getPropertyMap()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










