How to log Process id using Log4cxx or log4j

半城伤御伤魂 提交于 2019-12-04 18:52:44

问题


I am using log4cxx my project and i can able to log current thread id using [%t] marker, how to log process id in it or log4j?.

I am using ConversionPattern & xml based configuration file.

Thanks,


回答1:


Based on the above answers, I'm going to do this in log4j as follows:

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());
}

Then in my log4j.properties:

log4j.appender.FILE.layout.ConversionPattern=%d %X{PID} [%t] %p %c{1} %x - %m%n

This will actually yield a PID that consists of the ID number and the hostname, at least on my implementation of Java, and from what I read that could be implementation specific. You could go further and split out just the PID.




回答2:


I've grepped through log4j's and log4cxx's documentation and nowhere did I find anything about logging process id.

So, to be short: no, you can't log process id, at least not directly.

Since you're using C++, you can get your program's PID. Here is how to do it in Linux (Ubuntu in this link). Here is how do do it in Windows.

Get that PID at your program start, use an MDC and put your PID in it.

I don't think there's a better way.

Doing this in log4j would be even trickier, since I know of no way for a running program to get it's PID using standard Java classes.




回答3:


This doesnt exist in any of the log4xxx, but with a litle effort you can make it yourself. Actually it's a very simple task if you don't mind a little coding. This is basically what I did few times - override actual appender, or it's layout, make sure your class sticks the process ID into event properties map. Then use this property by name as if it was an MDC property. Using MDC directly like suggested above is not the best choice because they are thread bound and you will have to make sure every thread puts the PID when it starts. But if you can't or don't want to override the appender or layout, then this would probably be the only option.




回答4:


The answer by @skiphoppy works very well for Log4j1.x, but I thought it could be updated to show how it works in the new Log4j2.

(NOTE: I tried to submit this as an edit of the posting above as it is only a minor revision of the answer code, but I'm posting it as a separate answer since my revision was rejected.)

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());
}

As skiphoppy's answer states, it outputs a little more than just the process ID. For instance, on my machine (Fedora 20):

16237@localhost.localdomain

You can extract just the process id with the following code, placed in your XML configuration file: %replace{%X{PID}}{[A-Za-z@\.]*}{}

Given the output above for the process id:

16237@localhost.localdomain

the regex will produce

16237




回答5:


There is no feature in Log4J to achieve this, however you could pass the process id in and use that.

This blog post shows one way to go about it: http://blackbeanbag.net/wp/2009/01/14/log-file-management-in-coherence-using-log4j/

Basically, pass in the process id as a system property and then use that in the Log4j pattern.

Apparently, this is due to the JVM not providing an easy method to access the process id. From JDK1.5+, this may work. (Archived from dead link http://www.theresearchkitchen.com/archives/100 )



来源:https://stackoverflow.com/questions/4286089/how-to-log-process-id-using-log4cxx-or-log4j

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!