您可以使用
Mapped Diagnostic Context来解决问题。
import org.slf4j.MDC;
public class Main {
public static void main(String... args) {
MDC.put("process_id",
ManagementFactory.getRuntimeMXBean().getName());
}
}
接下来,您只需要按照以下方式重新定义您的模式:
<pattern>{..., "process_id": "%X{process_id}"}</pattern>
编辑
您还可以创建自己的编码器和转换器,并在logback.xml
中使用它们:
import ch.qos.logback.classic.PatternLayout;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
public class ExtendedPatternLayoutEncoder extends PatternLayoutEncoder {
@Override
public void start() {
PatternLayout.defaultConverterMap.put(
"process_id", ProcessIdConverter.class.getName());
super.start();
}
}
import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import java.lang.management.ManagementFactory;
public class ProcessIdConverter extends ClassicConverter {
private static final String PROCESS_ID =
ManagementFactory.getRuntimeMXBean().getName();
@Override
public String convert(final ILoggingEvent event) {
return PROCESS_ID;
}
}
<encoder class="some.package.ExtendedPatternLayoutEncoder">
<pattern>{..., "process_id": "%process_id"}</pattern>
</encoder>
完整示例:
<encoder class="some.package.ExtendedPatternLayoutEncoder">
<pattern>%d{dd.MM.yyyy HH:mm:ss.SSS} PID:%process_id [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
ch.qos.logback.classic.PatternLayoutBase
类并将你的转换器放在defaultConverterMap
中。但这是一个肮脏的 hack :) - vsminkovch.qos.logback.classic.PatternLayout
继承并在您的 logback.xml 文件中使用它,就像这里所示。 - vsminkovjson
输出是个好主意,这样你就可以正确地转义 "mesg" 中的消息。 - vsminkov