我需要在我的log4js日志中包含PID。我看到很多使用线程上下文的例子。但是,需要在创建的每个单独线程上设置这些。我不愿意这样做。
我需要一个解决方案,要么不使用线程上下文,要么可以在任何线程上下文中为任何可能创建的线程设置任何类的PID。
答案 0 :(得分:4)
请在Log4j2 issue tracker上创建功能请求,以使其成为内置功能。</ p>
目前,您可以创建自定义插件。见下面的代码。这样您就可以在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);
}
}
有关Log4j2插件如何工作的更多详细信息,请参阅manual。
让Log4j2识别您的插件的一种方法是在配置的packages
属性中指定插件类的包名称:
<Configuration status="trace"
packages="com.myorg.mypluginpackage">
(Trace打开Log4j2内部调试以帮助进行故障排除。)