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?
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
I don't know of such an option. But you can extend your current appender (for example
RollingFileAppender
) and provide anappend
/doAppend
/subAppend
method (depending on which class you are extending) to handle this.The throwable information is contained in
LoggingEvent.throwableInformation
That said, I'm not sure you should do this - you can lose important information that way.
Yes, it is part of log4j since log4j 1.2.16
Here is the original proposal in the Apache issue tracker that describes in detail how each of the applications of the %throwable pattern looks like: https://issues.apache.org/bugzilla/show_bug.cgi?id=48902#c0
Yup... EnhancedPatternLayout provides this functionality. (Since Log4J-1.2.16, was in extra companions before).
For a log4j config of
and for a piece of Java code like
You get the following in the log file...
If we remove the '%throwable{short}' from our log4j config file we would get the full stack trace
In log4j2.xml simply add %throwable{short} at end. No need to add param name.
ref : https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout