Pregunta

Utilizamos Log4j (y Commons Logging) para registrar nuestros mensajes de error. Ahora queremos configurar un agregador de registro adicional que genere errores fatales en syslog, pero sin los rastreos de pila excepcionalmente largos de Java (todavía estarán disponibles en el archivo de registro completo).

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

¿Fue útil?

Solución

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

Todavía necesita subclasificar PatternLayout, pero el método que desea anular es ignoreThrowable (): debería devolver false, lo que evitará que el appender escriba Throwable (se supone que el diseño ya lo ha hecho).

No hay forma de especificar esto en la configuración: PatternLayout tiene un "volver verdadero" codificado.

Otros consejos

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

import org.apache.log4j.PatternLayout;

public class NoStackTracePatterLayout extends PatternLayout {

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

Si usa log4j > 1.2.16, puede utilizar el EnhancedPatternLayout layout.

Ejemplo (con un archivo log4j.properties), defínalo como el diseño de su apéndice y luego agregue % 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}

En 1.2.16 puede usar EnhancedPatternLayout

El " nopex " o '' nopexception '' la palabra de conversión en logback-classic (sucesor de log4j) deshabilita la impresión de trazas de pila. El " nopex " la palabra de conversión se documenta junto con el resto de palabras de conversión . Necesitas desplazarte un poco hacia abajo.

Si necesita más información sobre este tema, comuníquese con la lista de correo del usuario de logback.

A partir de Log4j2, puede agregar "% ex {0} " a su patrón de registro (suponiendo que esté usando PatternLayout)

https://logging.apache.org/log4j/log4j -2.1 / manual / layouts.html

Es posible que deba escribir un diseño personalizado para hacerlo (lo cual no es tan malo; podría subclasificar PatternLayout).

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 único lugar (o pocos si tiene varios puntos de entrada de aplicación), cree una instancia de Log4j Logger con una clase especial o MDC de "syslog". o similar. Al detectar un error que pronto será FATAL, regístrelo de la manera habitual (para sus otros archivos de registro y tal), pero también invoque el método fatal () en este nuevo '' syslog '' Registrador con solo el mensaje preciso que desea (como solo la clase de excepción y el mensaje pero sin el seguimiento de la pila). Luego configure Log4j para dirigir solo este " syslog " clase o MDC a un Appender recién configurado que se dirige al SysLog.

¡Ta-dum!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top