我需要在我的log4js日誌中包含PID。我看到很多使用線程上下文的例子。但是,這些需要在創建的每個單獨的線程上進行設置。我受到這樣的限制。在不使用線程上下文的情況下記錄log4j2中的PID
我需要一個解決方案,既不使用線程上下文,也可以爲任何可能創建的線程設置所有線程上下文的PID。
我需要在我的log4js日誌中包含PID。我看到很多使用線程上下文的例子。但是,這些需要在創建的每個單獨的線程上進行設置。我受到這樣的限制。在不使用線程上下文的情況下記錄log4j2中的PID
我需要一個解決方案,既不使用線程上下文,也可以爲任何可能創建的線程設置所有線程上下文的PID。
請在Log4j2 issue tracker上創建功能請求,以使其成爲內置功能。
現在,您可以創建一個自定義插件。見下面的代碼。這將允許您在pattern layout中指定%pid
(與消息的%m
類似)。
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
@Plugin(name = "ProcessIdPatternConverter", category = "Converter")
@ConverterKeys({ "pid", "processId" })
public final class ProcessIdPatternConverter extends LogEventPatternConverter {
private final String pid;
private ProcessIdPatternConverter(String[] options) {
super("Process ID", "pid");
String temp = options.length > 0 ? options[0] : "???";
try {
// likely works on most platforms
temp = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
} catch (final Exception ex) {
try {
// try a Linux-specific way
temp = new File("/proc/self").getCanonicalFile().getName();
} catch (final IOException ignoredUseDefault) {}
}
pid = temp;
}
/**
* Obtains an instance of ProcessIdPatternConverter.
*
* @param options users may specify a default like {@code %pid{NOPID} }
* @return instance of ProcessIdPatternConverter.
*/
public static ProcessIdPatternConverter newInstance(final String[] options) {
return new ProcessIdPatternConverter(options);
}
@Override
public void format(final LogEvent event, final StringBuilder toAppendTo) {
toAppendTo.append(pid);
}
}
查看manual瞭解更多關於Log4j2插件如何工作的細節。讓Log4j2認識你的插件
一種方式是在配置的packages
屬性指定插件類的包名稱:(跟蹤上Log4j2內部調試以幫助排除故障切換)
<Configuration status="trace"
packages="com.myorg.mypluginpackage">
我們已經爲此添加了功能請求:https://issues.apache.org/jira/browse/LOG4J2-1884 – Matt