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

pdtvr36n  于 5个月前  发布在  其他
关注(0)|答案(5)|浏览(53)

我想在程序中只记录栈跟踪的前几行。我知道,我可以这样做,只打印堆栈跟踪的前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(或者更准确地说,slf4j而不是log4j)来记录日志。有没有一种方法可以告诉log4j它应该只打印堆栈跟踪的前5行?

nafvub8i

nafvub8i1#

你可以使用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

6yjfywim

6yjfywim2#

是的. 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>

字符串
对于一段Java代码,
throw new Exception(new Exception(“Inner Exception”));
您将在日志文件中获得以下内容...
java.lang.Exception:java.lang.Exception:Inner Exception
如果我们从log4j配置文件中删除'%throwable{short}',我们将获得完整的堆栈跟踪

f0brbegy

f0brbegy3#

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

<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %m%n %throwable{short} %n"/>

字符串
参考:https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout

relj7zay

relj7zay4#

但是你可以扩展你当前的appender(例如RollingFileAppender),并提供一个append/doAppend/subAppend方法(取决于你扩展的类)来处理这个问题。
可抛出信息包含在LoggingEvent.throwableInformation
也就是说,我不确定你应该这样做-你可以失去重要的信息,这样。

rta7y2nd

rta7y2nd5#

是的,从log4j 1.2.16开始,它是log4j的一部分
以下是Apache问题跟踪器中的原始提案,详细描述了%throwable模式的每个应用程序的外观:https://issues.apache.org/bugzilla/show_bug.cgi?id=48902#c0

相关问题