2008-12-08 19 views
14

Usamos Log4j (y el Registro de Commons) para registrar nuestros mensajes de error. Ahora queremos configurar un appender de registro adicional que genere errores fatales para syslog, pero sin las rastreas de pila Java excepcionalmente largas (aún estarán disponibles en el archivo de registro completo).¿Cómo puedo configurar log4j para que no imprima el stacktrace de excepción?

¿Cómo se configura esto (usando log4j.xml)? ¿Hay un filtro disponible para ignorar los rastros de la pila?

+0

Otro caso de uso donde uno podría desear esto es cuando se está ejecutando un conjunto de pruebas que contienen pruebas negativas que se espera generen excepciones que siempre queremos iniciar en la producción. No queremos que nuestros registros de prueba estén llenos de excepciones que son parte del curso –

Respuesta

14

Editar después de leer un poco más de la fuente:

Todavía es necesario subclase PatternLayout, pero el método que desea anular es ignoresThrowable(): devuelve falso, lo que evitará la appender de escribir el Throwable (se supone que el diseño ya lo ha hecho).

No hay manera de especificar esto en la configuración: PatternLayout tiene un código fijo "return true".

+1

Bien, eso funciona, gracias. Lástima que esta no sea una opción de configuración con log4j.Me pregunto por qué esto se maneja de manera muy diferente a las otras opciones disponibles para PatternLayout. Parece una opción de formateo natural para mí ... – Thilo

+1

Es un poco extraño: cuando miré por primera vez el código, pensé que los diseños lo manejaban todo, y luego descubrí que en realidad era el appender. Y que los appenders son ligeramente diferentes. Si va a hacer esto, puede agregar un setter para ignoreThroable() y enviar un parche. – kdgregory

1

Es posible que deba escribir un diseño personalizado para hacerlo (lo que no es malo, podría crear una subclase PatternLayout).

0

Si puede cambiar el código fuente, entonces hay otra opción disponible para su consideración.

En mis aplicaciones, siempre y solo registro mensajes FATAL desde el punto de entrada de mis aplicaciones (por ejemplo, "main()"), ya que solo sé que son fatales si estoy a punto de salir de la aplicación debido a ellos.

Por lo tanto, en este lugar (o un puñado si tiene múltiples puntos de entrada de aplicaciones), crea una instancia de Log4j Logger con una clase especial o MDC de "syslog" o similar. Al detectar un error que pronto será FATAL, conéctelo de la forma habitual (para sus otros archivos de registro y demás), pero también invoque el método fatal() en este nuevo registrador "syslog" con el mensaje preciso que usted querer (como solo la clase de excepción y el mensaje, pero sin el seguimiento de la pila). A continuación, configure Log4j para dirigir solo esta clase de "syslog" o MDC a un Appender recién configurado que se dirija a SysLog.

Ta-dum!

2

La palabra de conversión "nopex" o "noxception" en logback-classic (sucesor de log4j) deshabilita los seguimientos de la pila de impresión. La palabra de conversión "nopex" está documentada junto con el rest of conversion words. Tienes que desplazarte un poco hacia abajo.

Si necesita más información sobre este tema, póngase en contacto con la lista de correo de usuario de logback.

9

Aquí está el código real que utilizo:

import org.apache.log4j.PatternLayout; 

public class NoStackTracePatterLayout extends PatternLayout { 

@Override 
public boolean ignoresThrowable(){ 
    return false; 
} 
} 
+0

Gracias. De nuevo, tener que escribir una subclase solo para esto no es agradable. Debería haber sido una opción de configuración en PatternLayout. – Thilo

4

En 1.2.16 se puede utilizar EnhancedPatternLayout

+0

Esto fue útil para mí. Gracias. –

4

Si utiliza log4j> 1.2.16, puede utilizar la disposición EnhancedPatternLayout.

Ejemplo (con un archivo log4j.properties), lo definen como el diseño de su appender, y luego añadir %throwable{0} en el patrón de conversión:

log4j.appender.XXX.layout=org.apache.log4j.EnhancedPatternLayout 
log4j.appender.XXX.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c:%L - %m%n%throwable{0} 
+0

Esto es exactamente lo que necesito, pero con la envoltura slf4j 'slf4j-log4j12' versión' 1.7.12' (bajo el capó que usa 'log4j' versión' 1.2.17') todavía muestra la JSONException completa :(¿Alguien tiene alguna idea por que? –

Cuestiones relacionadas