Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Log4j formatting: Is it possible to truncate stacktraces?

I want to log only the first few lines of Exceptions in my program. I know, I can do something like this to print only the first 5 lines of a stacktrace:

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

But I would rather use log4j (or slf4j over log4j to be more precise) for logging. Is there a way to tell log4j that it should only print the first 5 lines of a stacktrace?

like image 724
rompetroll Avatar asked Jul 16 '10 10:07

rompetroll


2 Answers

You can use a EnhancedPatternLayout in log4j to format your stacktraces.

See http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/EnhancedPatternLayout.html, specifically the section about the "throwable" pattern in the pattern table.

Note that support for the %throwable{n} support is rather new and requires at least log4j 1.2.16 (which is the latest at time of writing)

For tracking purposes, this is the ticket that dealt with its implementation: https://issues.apache.org/bugzilla/show_bug.cgi?id=48902

like image 59
Hendrik Avatar answered Sep 28 '22 10:09

Hendrik


Yup... EnhancedPatternLayout provides this functionality. (Since Log4J-1.2.16, was in extra companions before).

For a log4j config of

<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> 

and for a piece of Java code like

throw new Exception(new Exception("Inner Exception"));

You get the following in the log file...

java.lang.Exception: java.lang.Exception: Inner Exception

If we remove the '%throwable{short}' from our log4j config file we would get the full stack trace

like image 44
prav Avatar answered Sep 28 '22 08:09

prav