log4j2:包含PID

SRo*_*mes 6 java logging log4j log4j2

我正在使用log4j2,同时在不同的进程(即不同的JVM)中运行相同代码的多个实例.我希望所有进程都能记录到同一个文件,interleaved如何配置(通过log4j2.xml)输出PID,以便在日志中区分不同的进程?

Ric*_*oig 8

从 2.9 版开始,log4j2-core 中有一个插件ProcessIdPatternConverter就是这样做的。

只需在模式布局中设置%pid%processId 即可记录它。

log4j 文档:https : //logging.apache.org/log4j/2.x/manual/layouts.html


Pau*_*gas 7

也许MDC可以帮到你.试试这个:

Java:

import java.lang.management.ManagementFactory;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;

public class TestPID {

    private static final Logger LOG = LogManager.getLogger(TestPID.class);

    static {
        // Get the process id
        String pid = ManagementFactory.getRuntimeMXBean().getName().replaceAll("@.*", "");

        // MDC
        ThreadContext.put("pid", pid);
    }

    public static void main(String[] args) {
        LOG.info("Testing...");
    }

}
Run Code Online (Sandbox Code Playgroud)

XML:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d %5X{pid} %-5p %c#%M - %m%n" />
    </Console>
  </Appenders>
  <Loggers>
    <Root level="info">
      <AppenderRef ref="Console" />
    </Root>
  </Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)

输出:

2014-09-10 00:13:49,281  7164 INFO  TestPID#main - Testing...
                         ????
                    That's the PID
Run Code Online (Sandbox Code Playgroud)

你可能想看到: