如何使用Log4cxx或log4j记录进程ID

5cg8jx4n  于 2022-11-06  发布在  其他
关注(0)|答案(5)|浏览(230)

我正在使用log4cxx我的项目,我可以使用[%t]标记来记录当前线程ID,如何在其中记录进程ID或log4j?
我正在使用基于ConversionPattern和xml的配置文件。
谢谢你,

dauxcl2d

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实现中是这样的,从我所读到的内容来看,这可能是特定于实现的。

iibxawm4

iibxawm42#

我已经浏览了log4j和log4cxx的文档,没有找到任何关于日志进程id的内容。
所以,简而言之:不,您不能记录进程ID,至少不能直接记录。
因为你使用的是C++,你可以得到你的程序的PID。Here是如何在Linux中做到这一点(Ubuntu在这个链接中)。Here是如何在Windows中做到这一点。
在程序开始时获取该PID,使用MDC并将您的PID放入其中。
我不认为有更好的方法。
在log4j中这样做会更加棘手,因为我不知道运行中的程序如何使用标准Java类来获取它的PID。

nwlls2ji

nwlls2ji3#

这在任何log 4xxx中都不存在,但是你可以自己做。实际上,如果你不介意编写一些代码,这是一个非常简单的任务。这基本上是我做过几次的a-覆盖实际的appender,或者它的布局。请确保你的类将进程ID粘贴到事件属性Map中。2然后按名称使用这个属性,就像它是MDC属性一样。像上面建议的那样直接使用MDC并不是最好的选择,因为它们是线程绑定的,你必须确保每个线程在启动时都放置PID。但是如果你不能或者不想覆盖追加器或布局,那么这可能是唯一的选择。

hfsqlsce

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

a6b3iqyw

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存档)

相关问题