我正在使用log4cxx我的项目,我可以使用[%t]标记来记录当前线程ID,如何在其中记录进程ID或log4j?我正在使用基于ConversionPattern和xml的配置文件。谢谢你,
dauxcl2d1#
根据上面的答案,我将在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实现中是这样的,从我所读到的内容来看,这可能是特定于实现的。
iibxawm42#
我已经浏览了log4j和log4cxx的文档,没有找到任何关于日志进程id的内容。所以,简而言之:不,您不能记录进程ID,至少不能直接记录。因为你使用的是C++,你可以得到你的程序的PID。Here是如何在Linux中做到这一点(Ubuntu在这个链接中)。Here是如何在Windows中做到这一点。在程序开始时获取该PID,使用MDC并将您的PID放入其中。我不认为有更好的方法。在log4j中这样做会更加棘手,因为我不知道运行中的程序如何使用标准Java类来获取它的PID。
nwlls2ji3#
这在任何log 4xxx中都不存在,但是你可以自己做。实际上,如果你不介意编写一些代码,这是一个非常简单的任务。这基本上是我做过几次的a-覆盖实际的appender,或者它的布局。请确保你的类将进程ID粘贴到事件属性Map中。2然后按名称使用这个属性,就像它是MDC属性一样。像上面建议的那样直接使用MDC并不是最好的选择,因为它们是线程绑定的,你必须确保每个线程在启动时都放置PID。但是如果你不能或者不想覆盖追加器或布局,那么这可能是唯一的选择。
hfsqlsce4#
@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您可以使用下列程式码,只撷取XML组态档中的行程序ID:%replace{%X{PID}}{[A-Za-z@\.]*}{}给定进程id的上述输出:16237@localhost.localdomain正则表达式将生成16237
%replace{%X{PID}}{[A-Za-z@\.]*}{}
a6b3iqyw5#
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存档)
5条答案
按热度按时间dauxcl2d1#
根据上面的答案,我将在log4j中执行以下操作:
然后在我的log4j.properties:
这实际上会产生一个由ID号和主机名组成的PID,至少在我的Java实现中是这样的,从我所读到的内容来看,这可能是特定于实现的。
iibxawm42#
我已经浏览了log4j和log4cxx的文档,没有找到任何关于日志进程id的内容。
所以,简而言之:不,您不能记录进程ID,至少不能直接记录。
因为你使用的是C++,你可以得到你的程序的PID。Here是如何在Linux中做到这一点(Ubuntu在这个链接中)。Here是如何在Windows中做到这一点。
在程序开始时获取该PID,使用MDC并将您的PID放入其中。
我不认为有更好的方法。
在log4j中这样做会更加棘手,因为我不知道运行中的程序如何使用标准Java类来获取它的PID。
nwlls2ji3#
这在任何log 4xxx中都不存在,但是你可以自己做。实际上,如果你不介意编写一些代码,这是一个非常简单的任务。这基本上是我做过几次的a-覆盖实际的appender,或者它的布局。请确保你的类将进程ID粘贴到事件属性Map中。2然后按名称使用这个属性,就像它是MDC属性一样。像上面建议的那样直接使用MDC并不是最好的选择,因为它们是线程绑定的,你必须确保每个线程在启动时都放置PID。但是如果你不能或者不想覆盖追加器或布局,那么这可能是唯一的选择。
hfsqlsce4#
@skiphoppy的答案对于Log4j1.x非常有效,但我认为可以更新它,以显示它在新的Log4j2中是如何工作的。
(注意:我试图将此作为上述帖子的编辑提交,因为它只是答案代码的一个小修改,但由于我的修改被拒绝,我将其作为单独的答案发布。)
正如skiphoppy的回答所述,它输出的不仅仅是进程ID。例如,在我的机器(Fedora 20)上:
16237@localhost.localdomain
您可以使用下列程式码,只撷取XML组态档中的行程序ID:
%replace{%X{PID}}{[A-Za-z@\.]*}{}
给定进程id的上述输出:
16237@localhost.localdomain
正则表达式将生成
16237
a6b3iqyw5#
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存档)