2010-07-16 13 views
27

Quiero registrar solo las primeras líneas de Excepciones en mi programa. Lo sé, lo puedo hacer algo como esto para imprimir sólo los primeros 5 líneas de un StackTrace:Formateo de Log4j: ¿es posible truncar stacktraces?

Throwable e = ...; 
StackTraceElement[] stack = e.getStackTrace(); 
int maxLines = (stack.length > 4) ? 5 : stack.length; 
for (int n = 0; n < maxLines; n++) { 
    System.err.println(stack[n].toString()); 
} 

Pero preferiría usar log4j (o slf4j sobre log4j para ser más precisos) para el registro. ¿Hay alguna manera de decirle a log4j que solo debería imprimir las primeras 5 líneas de un stacktrace?

Respuesta

29

Puede usar EnhancedPatternLayout en log4j para formatear sus stacktraces.

Consulte http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/EnhancedPatternLayout.html, específicamente la sección sobre el patrón "arrojadizo" en la tabla de patrones.

cuenta que el soporte para el apoyo %throwable{n} es bastante nuevo y requiere al menos log4j 1.2.16 (que es la más reciente en el momento de escribir esto)

para fines de seguimiento, este es el billete que se ocupa de su ejecución: https://issues.apache.org/bugzilla/show_bug.cgi?id=48902

+0

maravilloso,% throwable {5} se limita a lo que necesito. – rompetroll

+1

Tenga en cuenta que en caso de excepciones anidadas, esto cortará sin piedad los mensajes anidados, por lo que para muchos casos de uso del mundo real, esto es inútil. Lo que los desarrolladores necesitarían sería limitar el número de elementos de la pila por excepción en la traza. – tkruse

1

No conozco esta opción. Pero puede ampliar su appender actual (por ejemplo, RollingFileAppender) y proporcionar un método append/doAppend/subAppend (dependiendo de la clase que esté extendiendo) para manejar esto.

La información está contenida en throwable LoggingEvent.throwableInformation

Dicho esto, no estoy seguro de que debe hacer esto - se puede perder información importante de esa manera.

8

Yup ... EnhancedPatternLayout proporciona esta funcionalidad. (Desde Log4J-1.2.16, estaba en compañeros adicionales antes).

Para una configuración de log4j de

<appender name="Console" class="org.apache.log4j.ConsoleAppender"> 
    <param name="Threshold" value="debug"/> 
    <layout class="org.apache.log4j.EnhancedPatternLayout"> 
     <param name="ConversionPattern" value="%d %-5p [%t] %c.%M - %m%n %throwable{short}"/> 
    </layout> 
</appender> 

y por un pedazo de código Java como

tiro nueva Excepción (nueva Excepción ("excepción interna"));

Se obtiene lo siguiente en el archivo de registro ...

java.lang.Exception: java.lang.Exception: excepción interna

Si eliminamos el '% throwable {corta}' de nuestro archivo de configuración de log4j que se pueden conseguir la traza completa