Logback 日志记录模式中的进程 ID
Process Id in Logback Logging Pattern
我有以下 logback 模式:
<pattern>
{"hostname": "${HOSTNAME}",
"level": "%p",
"method": "%M",
"process_id": "${process}",
"thread_id": "%t",
"timestamp": "%d{Y-M-d}T%d{H:M:S.s}",
"mesg":"%msg"}%n
</pattern>
不幸的是,当日志消息实际生成时,我看到:"process_id": "process_IS_UNDEFINED"
是否有任何自动设置的进程 ID 变量,例如主机名?我很难在 logback 文档中找到此类自动设置变量的记录列表,有人知道更好的文档来源吗?
编辑:我知道映射诊断上下文,但希望有一个不需要此类设置的内置解决方案,就像主机名的工作方式一样。
也许你可以尝试 %thread 而不是进程。
你可以用Mapped Diagnostic Context解决你的问题:
import org.slf4j.MDC;
public class Main {
public static void main(String... args) {
// put process ID early
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() {
// put your converter
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) {
// for every logging event return processId from mx bean
// (or better alternative)
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>
有比@vsminkov 更好的解决方案。
我在这里找到它:Layouts,是不是说 创建自定义转换说明符 。
基本上你创建你的转换器,而不是扩展 PatternLayoutEncoder
你添加一个转换规则到你的配置:
<configuration>
<conversionRule conversionWord="pid"
converterClass="my.custom.converter.ProcessIdConverter" />
<conversionRule conversionWord="processId"
converterClass="my.custom.converter.ProcessIdConverter" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-6pid [%thread] - %msg%n</pattern>
</encoder>
</appender>
...
</configuration>
这样你就摆脱了编码器
我尝试使用对我有用的 ${PID}
<pattern>
{"hostname": "${HOSTNAME}",
"level": "%p",
"method": "%M",
"process_id": "${PID}",
"thread_id": "%t",
"timestamp": "%d{Y-M-d}T%d{H:M:S.s}",
"mesg":"%msg"}%n
</pattern>
DefaultLogbackConfiguration 中定义的控制台日志记录的默认模式是:
"${CONSOLE_LOG_PATTERN:-"
+ "%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) "
+ "%clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} "
+ "%clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"
正如@Hlulani 所指出的,正如您在此默认模式中看到的那样,您可以使用 ${PID} 并且 logback 将用进程 ID 替换它。
我有以下 logback 模式:
<pattern>
{"hostname": "${HOSTNAME}",
"level": "%p",
"method": "%M",
"process_id": "${process}",
"thread_id": "%t",
"timestamp": "%d{Y-M-d}T%d{H:M:S.s}",
"mesg":"%msg"}%n
</pattern>
不幸的是,当日志消息实际生成时,我看到:"process_id": "process_IS_UNDEFINED"
是否有任何自动设置的进程 ID 变量,例如主机名?我很难在 logback 文档中找到此类自动设置变量的记录列表,有人知道更好的文档来源吗?
编辑:我知道映射诊断上下文,但希望有一个不需要此类设置的内置解决方案,就像主机名的工作方式一样。
也许你可以尝试 %thread 而不是进程。
你可以用Mapped Diagnostic Context解决你的问题:
import org.slf4j.MDC;
public class Main {
public static void main(String... args) {
// put process ID early
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() {
// put your converter
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) {
// for every logging event return processId from mx bean
// (or better alternative)
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>
有比@vsminkov 更好的解决方案。
我在这里找到它:Layouts,是不是说 创建自定义转换说明符 。
基本上你创建你的转换器,而不是扩展 PatternLayoutEncoder
你添加一个转换规则到你的配置:
<configuration>
<conversionRule conversionWord="pid"
converterClass="my.custom.converter.ProcessIdConverter" />
<conversionRule conversionWord="processId"
converterClass="my.custom.converter.ProcessIdConverter" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-6pid [%thread] - %msg%n</pattern>
</encoder>
</appender>
...
</configuration>
这样你就摆脱了编码器
我尝试使用对我有用的 ${PID}
<pattern>
{"hostname": "${HOSTNAME}",
"level": "%p",
"method": "%M",
"process_id": "${PID}",
"thread_id": "%t",
"timestamp": "%d{Y-M-d}T%d{H:M:S.s}",
"mesg":"%msg"}%n
</pattern>
DefaultLogbackConfiguration 中定义的控制台日志记录的默认模式是:
"${CONSOLE_LOG_PATTERN:-"
+ "%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) "
+ "%clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} "
+ "%clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"
正如@Hlulani 所指出的,正如您在此默认模式中看到的那样,您可以使用 ${PID} 并且 logback 将用进程 ID 替换它。