我正在使用log4cxx我的项目,我能够使用[%t]标记记录当前线程ID,如何记录进程ID或log4j?。
我正在使用ConversionPattern&基于xml的配置文件。
谢谢,
答案 0 :(得分:12)
根据以上答案,我将在log4j中执行以下操作:
import java.lang.management.*;
import org.apache.log4j.MDC;
private String getPID() {
RuntimeMXBean rt = ManagementFactory.getRuntimeMXBean();
return rt.getName();
}
private void configLog4j() {
// call this from somewhere before you start logging
MDC.put("PID", getPID());
}
然后在我的log4j.properties中:
log4j.appender.FILE.layout.ConversionPattern=%d %X{PID} [%t] %p %c{1} %x - %m%n
这实际上会产生一个由ID号和主机名组成的PID,至少在我的Java实现上,以及我读到的可能是特定于实现的内容。你可以更进一步,只拆分PID。
答案 1 :(得分:5)
我已经通过log4j和log4cxx的文档进行了深入研究,没有找到任何关于日志记录进程ID的信息。
所以,简而言之:不,你不能记录进程id,至少不能直接记录进程id。
由于您使用的是C ++,因此您可以获得程序的PID。 Here是如何在Linux中完成的(在此链接中为Ubuntu)。 Here是如何在Windows中完成的。
在程序启动时获取该PID,使用MDC并将PID放入其中。
我认为没有更好的方法。
在log4j中执行此操作会更加棘手,因为我知道正在运行的程序无法使用标准Java类来获取它的PID。
答案 2 :(得分:1)
Log4J中没有实现此功能的功能,但您可以传入进程ID并使用它。
此博文显示了一种方法:http://blackbeanbag.net/wp/2009/01/14/log-file-management-in-coherence-using-log4j/
基本上,将进程id作为系统属性传递,然后在Log4j模式中使用它。
显然,这是由于JVM没有提供访问进程ID的简单方法。从JDK1.5 +开始,this可能有效。 (从死链接http://www.theresearchkitchen.com/archives/100存档)
答案 3 :(得分:1)
这在任何log4xxx中都不存在,但是你可以自己动手制作。实际上,如果你不介意一点编码,这是一个非常简单的任务。这基本上是我做过几次 - 覆盖实际的appender,或者它的布局,确保你的类将进程ID粘贴到事件属性映射中。然后按名称使用此属性,就好像它是MDC属性一样。像上面建议的那样直接使用MDC并不是最好的选择,因为它们是线程绑定的,你必须确保每个线程在启动时放入PID。但是如果你不能或不想覆盖appender或布局,那么这可能是唯一的选择。
答案 4 :(得分:1)
@skiphoppy的答案对Log4j1.x非常有效,但我认为它可以更新以显示它在新的Log4j2中是如何工作的。
(注意:我尝试将此作为上述帖子的编辑提交,因为它只是对答案代码的一个小修改,但我将其作为单独的答案发布,因为我的修订被拒绝。)
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import org.apache.logging.log4j.ThreadContext;
private String getPID() {
RuntimeMXBean rt = ManagementFactory.getRuntimeMXBean();
return rt.getName();
}
private void configLog4j() {
// Here is the Log4j2 way
ThreadContext.put("PID", rtmx.getName());
}
作为skiphoppy的回答状态,它输出的内容不仅仅是进程ID。例如,在我的机器上(Fedora 20):
16237@localhost.localdomain
您可以使用以下代码仅提取进程ID,该代码放在XML配置文件中:%replace{%X{PID}}{[A-Za-z@\.]*}{}
给出进程id的上述输出:
16237@localhost.localdomain
正则表达式将产生
16237