在 log4j2 中记录 PID 而不使用线程上下文

ds3*_*90s 2 java configuration logging log4j log4j2

我需要在 log4js 日志中包含 PID。我看到很多使用线程上下文的例子。但是,这些需要在创建的每个单独线程上进行设置。我被迫不这样做。

我需要一个解决方案,要么不使用线程上下文,要么可以在所有线程上下文上为可能从任何任意类创建的任何线程设置 PID。

Rem*_*pma 5

请在 Log4j2问题跟踪器上创建功能请求,以使其成为内置功能。

现在,您可以创建自定义插件。请参阅下面的代码。%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);
    }
}
Run Code Online (Sandbox Code Playgroud)

有关 Log4j2 插件如何工作的更多详细信息,请参阅手册。

让 Log4j2 识别您的插件的一种方法是在packages配置的属性中指定插件类的包名称:

<Configuration status="trace" 
     packages="com.myorg.mypluginpackage">
Run Code Online (Sandbox Code Playgroud)

(Trace 开启 Log4j2 内部调试以帮助排除故障。)