2010-11-26 10 views

Respuesta

5

He grepped través de la documentación de log4j y log4cxx de y en ninguna parte me parece nada al respecto Identificación del proceso de registro.

Por lo tanto, para ser breve: no, no puede registrar la identificación del proceso, al menos no directamente.

Dado que utiliza C++, puede obtener el PID de su programa. Here es cómo hacerlo en Linux (Ubuntu en este enlace). Here es cómo hacerlo en Windows.

Obtenga ese PID al inicio de su programa, use un MDC y coloque su PID en él.

No creo que haya una mejor manera.

Hacer esto en log4j sería aún más complicado, ya que no conozco ninguna forma de que un programa en ejecución obtenga su PID usando clases Java estándar.

1

No hay ninguna característica en Log4J para lograr esto, sin embargo, puede pasar la identificación del proceso y usar eso.

Este blog muestra una forma de hacerlo: http://blackbeanbag.net/wp/2009/01/14/log-file-management-in-coherence-using-log4j/

pasan Básicamente, en el identificador de proceso como una propiedad del sistema y luego utilizar eso en el patrón de Log4j.

Aparentemente, esto se debe a que la JVM no proporciona un método sencillo para acceder a la identificación del proceso. De JDK1.5 +, esto puede funcionar: http://www.theresearchkitchen.com/archives/100

12

Con base en las respuestas anteriores, voy a hacer esto en log4j de la siguiente manera:

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

Luego, en mis log4j.properties:

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

Esto arrojará realmente un PID que consiste en el número de ID y el nombre de host, al menos en mi implementación de Java, y por lo que he leído que podría ser específico de la implementación. Podrías ir más allá y dividir solo el PID.

+1

Gracias trabajaron un campeón. – rogerdpack

+0

@rogerdpack, ¡me alegra que mi respuesta haya sido útil para usted! – skiphoppy

+0

Bummer que esto no funciona de la caja sin escribir código para log4j –

1

Esto no existe en ninguno de los log4xxx, pero con un poco de esfuerzo puede hacerlo usted mismo. En realidad, es una tarea muy simple si no te importa un poco de codificación. Esto es básicamente lo que hice pocas veces: anular el appender real, o su diseño, asegúrese de que su clase pegue el ID del proceso en el mapa de propiedades del evento. A continuación, utilice esta propiedad por su nombre como si fuera una propiedad de MDC. Usar MDC directamente como se sugirió anteriormente no es la mejor opción porque están encuadernados y usted deberá asegurarse de que cada hilo ponga el PID cuando se inicie. Pero si no puede o no desea anular el apéndice o el diseño, esta sería probablemente la única opción.

1

La respuesta de @skiphoppy funciona muy bien para Log4j1.x, pero pensé que podría actualizarse para mostrar cómo funciona en el nuevo Log4j2.

(NOTA: Intenté enviar esto como una edición de la publicación anterior, ya que es solo una revisión menor del código de respuesta, pero la publico como una respuesta separada ya que mi revisión fue rechazada).

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

Como la respuesta de los estados skiphoppy, se da salida a un poco más que sólo el ID del proceso. Por ejemplo, en mi máquina (Fedora 20):

[email protected]

Puede extraer sólo el identificador de proceso con el siguiente código, colocado en el archivo de configuración XML: %replace{%X{PID}}{[[email protected]\.]*}{}

Dada la salida anterior para el ID de proceso:

[email protected]

la expresión regular producirá

+0

+ 1 para% replace {% X {PID}} –

Cuestiones relacionadas