log4j2: 包含进程ID (PID)

11

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


你是在询问你的Java程序如何获取其PID,以便将其包含在生成的日志消息中吗?还是在询问如何配置log4j,以便在日志消息中插入PID? - Raedwald
我同意Peter的观点。这种方法可能看起来可行,但如果你进行类似滚动的操作,它可能会变得很脆弱。Log4j2(截至v2.0.2)并不是为这种用法而设计的。 - Remko Popma
@Raedwald - 是的,如何配置log4j以便在日志消息中插入PID或其他标识进程的方式。 - SRobertJames
@RemkoPopma 如果日志不处理滚动也没关系。 - SRobertJames
很有趣听到这个能够工作。你是在使用FileAppender还是RandomAccessFileAppender? - Remko Popma
显示剩余3条评论
4个回答

11

添加%pid是为了打印级别信息,因为级别信息的元字符是"%p",所以如果我使用%pid,它会打印"ERRORid"而不是打印进程ID。有没有其他替代方案? - arunb2w
你是否将log4j2-core库添加到依赖项中了? - Ricard Nàcher Roig
正常工作。已测试版本为2.14.1,%processId会转储进程的进程ID。 - apatniv

9
也许MDC能帮助你解决问题。可以尝试以下方法:MDCJava:
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
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)

1
如果您正在使用Spring框架,您只需要在模式值内添加“${PID}”,就可以了。 不需要像其他答案中提到的那样添加一个新功能来获取您的进程ID。

如果您提供带有${PID}变量的详细配置示例,将会非常有帮助。 - Petr Aleksandrov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接