如何在log4j2中格式化堆栈跟踪?

时间:2016-03-04 06:35:27

标签: logging log4j log4j2 stack-trace

默认情况下,log4j2在多行上打印stacktrace,以newline个字符分隔。类似的东西:

java.lang.NullPointerException: error enovountered
    at ...
    at ...
    at ...

我希望我的堆栈跟踪在一行上,基本上使用|作为分隔符,而不是\n

java.lang.NullPointerException: error enovountered at ... | at ... | at ...

我如何在log4j2中完成这样的事情?

4 个答案:

答案 0 :(得分:7)

PatternLayout documentation未提及此问题,但%throwable系列转化键实际上support being able to change the separator used for individual stack trace elements, as well as the "cause" exceptions。它似乎也不是一个新功能,因为它似乎已经存在了至少4年,假设我没有误读文件历史。

给出如下模式:

[%threadName] %-5level %logger{36} - %message{nolookups}%xThrowable{separator(|)}%n

您将获得如下输出:

[main] ERROR my.cool.Application - Catching java.lang.RuntimeException: I'm wrapping the NPE|   at my.cool.Application.main(Application.java:24) [main/:?]|Caused by: java.lang.NullPointerException: This is a forced NPE| at java.util.Objects.requireNonNull(Objects.java:228) ~[?:1.8.0_121]|   at my.cool.Application.main(Application.java:21) ~[main/:?]

答案 1 :(得分:4)

上面的答案包含食谱。我在这里添加例子:

<PatternLayout>
    <alwaysWriteExceptions>false</alwaysWriteExceptions>
    <pattern>%level;%d{yyyy-MM-dd HH:mm:ss.SSS};%t;%c;%enc{%msg}{CRLF};%replace{%ex}{[\r\n]{1,2}}{|}%n</pattern>
</PatternLayout>

如果跳过alwaysWriteExceptions参数,堆栈将出现两次 - 一次线性化,一次为多行。

答案 2 :(得分:1)

将模式布局的alwaysWriteExceptions属性设置为false。

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

编写您自己的异常转换器,根据需要格式化异常。

https://logging.apache.org/log4j/2.x/manual/extending.html#PatternConverters

将图案键添加到图案布局图案中。

答案 3 :(得分:0)

includeStacktrace使用JsonLayout

        <JsonLayout complete="false" compact="false" includeStacktrace="false">
        </JsonLayout>