2010-08-11 11 views
5

cuando se escribe¿Es posible prefijar cada línea de un stacktrace en log4j?

logger.error("message", exception); 

log4j produce el mensaje y el completo seguimiento de la pila:

Aug 9 06:26:13 10.175.60.14 myPrefix: [error] [TP-Processor114] [my.class.Name] message : exception 
at fatherOfException 
at fatherof_fatherOfException 
at fatherof_fatherof_fatherOfException 
... 

mi patrón de conversión es

log4j.appender.syslog.layout.ConversionPattern=myPrefix: [%p] [%t] [%c] [%x] - %m%n 

Por lo tanto, es posible prefijar cada línea con myPrefix, como:

Aug 9 06:26:13 10.175.60.14 myPrefix: [error] [TP-Processor114] [my.class.Name] message : exception 
myPrefix at fatherOfException 
myPrefix at fatherof_fatherOfException 
myPrefix at fatherof_fatherof_fatherOfException 
    ... 

Cuando grep mis registros en myPrefix, no veo el seguimiento de la pila. Tenemos muchos prefijos diferentes (uno por módulo)

Gracias de antemano.

Respuesta

2

Subclase ThrowableRenderer, por ejemplo:

import org.apache.log4j.DefaultThrowableRenderer; 
import org.apache.log4j.spi.ThrowableRenderer; 

public class LogThrowableRenderer implements ThrowableRenderer { 

    DefaultThrowableRenderer def = new DefaultThrowableRenderer(); 

    @Override 
    public String[] doRender(Throwable t) { 
     String[] temp = def.doRender(t); 
     for (int i = 0; i < temp.length; i++) { 
      temp[i] = "myPrefix "+temp[i]; 
     } 
     return temp; 
    } 

} 

Añadir a yo ur log4j.properties:

log4j.throwableRenderer=whatever.package.LogThrowableRenderer 

Este utiliza el DefaultThrowableRenderer existente para hacer que el StackTrace en el modo familiar antes de añadir el prefijo, por lo que incluirá el Throwable clase, mensaje, y la causa.

0

Escriba una función de envoltura para que lo haga por usted.

private void writeToLogs(String message, Exception excp) { 
    logger.error("myPrefix\t" + message, excp); 
} 
+0

Gracias por la sugerencia, pero esto no es lo que estoy buscando. Primero, hará varios registros en lugar de uno. Segundo, estoy trabajando en un proyecto bastante grande y no puedo imaginarme cambiar cada logger.log por otra cosa. Finalmente, su solución no prefija la línea "at" con el prefijo. Estoy buscando una solución de configuración de log4j. –

+0

O bien, lo siento. No estoy muy familiarizado con log4j pero cuando hice un Google rápido en él encontré esto, http://logging.apache.org/log4j/1.2/manual.html, es posible que ya lo haya visto, pero si se desplaza hacia abajo a la configuración de la mitad hacia abajo que podría ayudar. Lo siento, no pude ayudar más. – Mike

7

Consulte la respuesta de Alex, ya que es una más limpia.

Usted puede escribir su propia implementación de org.apache.log4j.spi.ThrowableRenderer:

http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/spi/ThrowableRenderer.html

A continuación, editar la configuración de log4j:

log4j.throwableRenderer = su costumbre-nombre-clase-

El ThrowableRenderer devuelve una matriz de String s. Aquí está el código:

String prefix = "myPrefix"; // Or some constant 

List<String> l = new LinkedList<String>(); 
l.add(String.format("%s %s: %s", prefix, t.getClass().getName(), t.getMessage())); 

for (StackTraceElement ste: t.getStackTrace()){ 
    l.add(String.format("%s %s", prefix, ste.toString())); 
} 

return (String[]) l.toArray(); 

Otra idea sería imprimir la Throwable en un PrintWriter que está terminando algunos Writer que escribe en la memoria, y luego volver a iterar sobre cadenas delimitadas por line.separator, añadiendo cada línea de una lista:

StringWriter sw = new StringWriter(); 
t.printStackTrace(new PrintWriter(sw)); 

List<String> l = new LinkedList<String>(); 
for (String s: sw.toString().split(System.lineSeparator())) { 
    l.add(String.format("%s %s", prefix, s)); 
} 

return (String[]) l.toArray(); 
+0

gracias por esto: voy a intentar esto. –

+2

funciona muy bien, gracias! pero tuve que migrar a log4j 1.2.16 para poder hacer esto –

+1

Esto no maneja la clase y el mensaje arrojado, ni ninguna causa. –

Cuestiones relacionadas