rom*_*oll 30 java logging log4j stack-trace
我想在我的程序中只记录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());
}
Run Code Online (Sandbox Code Playgroud)
但我宁愿使用log4j(或更精确的log4j上的slf4j)进行日志记录.有没有办法告诉log4j它应该只打印堆栈跟踪的前5行?
Hen*_*rik 35
您可以在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
小智 10
是的... EnhancedPatternLayout提供此功能.(自Log4J-1.2.16以来,之前是额外的伴侣).
对于log4j配置
<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>
Run Code Online (Sandbox Code Playgroud)
并为一段Java代码
抛出新的异常(new Exception("Inner Exception"));
您在日志文件中获得以下内容...
java.lang.Exception:java.lang.Exception:内部异常
如果我们从log4j配置文件中删除'%throwable {short}',我们将获得完整的堆栈跟踪
在 log4j2.xml 中,只需在末尾添加 %throwable{short} 即可。无需添加参数名称。
<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %m%n %throwable{short} %n"/>
Run Code Online (Sandbox Code Playgroud)
参考: https: //logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout
| 归档时间: |
|
| 查看次数: |
23090 次 |
| 最近记录: |