log4j2:包含PID

时间:2014-09-09 23:12:36

标签: java logging log4j log4j2

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

5 个答案:

答案 0 :(得分:6)

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

<强>爪哇

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...");
    }

}

<强> 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>

<强>输出

2014-09-10 00:13:49,281  7164 INFO  TestPID#main - Testing...
                         ↑↑↑↑
                    That's the PID

您可能希望看到:

答案 1 :(得分:3)

自版本2.9以来,log4j2-core中有一个插件ProcessIdPatternConverter就是这样做的。

在模式布局中设置%pid %processId 会记录它。

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

答案 2 :(得分:0)

如果您使用的是Spring框架,只需要在模式值内附加“ $ {PID}”即可。 无需添加其他函数即可获取其他答案中提到的processId。

答案 3 :(得分:0)

log4j.appender.consoleAppender.layout.ConversionPattern=%-25d %-5p ${PID} [%-10t] %c{3} - %m%n

导致

2021-03-23 11:42:57.281  INFO 896 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/v1]     : Initializing Spring FrameworkServlet 'dispatcherServlet'
2021-03-23 11:43:02,766   INFO  896 [http-nio-8080-exec-4] springboot.controller.MyController - greeting(/v1)

答案 4 :(得分:0)

使用 log4j 1.2.17

${PID} 抛出错误

log4j:ERROR Unexpected char [ ] 在转换模式中的位置 55。

这些解决方案没有经过很好的测试。