我正在使用log4j2,同时在不同的进程(即不同的JVM)中运行相同代码的多个实例。我希望所有进程都能记录到同一个文件,interleaved如何配置(通过log4j2.xml)输出PID,以便在日志中区分不同的进程?
答案 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。
这些解决方案没有经过很好的测试。