Log4j格式化:是否可以截断堆栈跟踪?

我想在我的程序中仅记录Exceptions的前几行。 我知道,我可以做这样的事情只打印堆栈跟踪的前5行:

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

但我宁愿使用log4j(或更精确的log4j上的slf4j)进行日志记录。 有没有办法告诉log4j它应该只打印堆栈跟踪的前5行?

您可以在log4j中使用EnhancedPatternLayout来格式化堆栈跟踪。

请参阅http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/EnhancedPatternLayout.html ,特别是有关模式表中“throwable”模式的部分。

请注意,对%throwable{n}支持的支持相当新,并且至少需要log4j 1.2.16(这是写入时的最新信息)

出于跟踪目的,这是处理其实现的票证: https : //issues.apache.org/bugzilla/show_bug.cgi?id = 48902

是的… EnhancedPatternLayout提供此function。 (自Log4J-1.2.16起,之前就是其他同伴)。

对于log4j配置

       

并为一段Java代码

抛出新的exception(新的exception(“内部exception”));

您在日志文件中获得以下内容…

java.lang.Exception:java.lang.Exception:内部exception

如果我们从log4j配置文件中删除’%throwable {short}’,我们将获得完整的堆栈跟踪

在log4j2.xml中,只需在结尾处添加%throwable {short}。 无需添加参数名称。

  

ref: https : //logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout

我不知道这样的选择。 但是你可以扩展你当前的appender(例如RollingFileAppender )并提供append / doAppend / subAppend方法(取决于你要扩展的类)来处理这个问题。

可抛出的信息包含在LoggingEvent.throwableInformation

也就是说,我不确定你应该这样做 – 你可以通过这种方式丢失重要信息。

是的,它是log4j的一部分,因为log4j 1.2.16

以下是Apache问题跟踪器中的原始提议,详细描述了%throwable模式的每个应用程序如何: https ://issues.apache.org/bugzilla/show_bug.cgi?id = 48902#c0