如何格式化log4j2中的stacktrace?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何格式化log4j2中的stacktrace?相关的知识,希望对你有一定的参考价值。

默认情况下,log4j2在多行上打印stacktrace,由newline字符分隔。就像是:

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

我想把我的堆栈跟踪放在一行,比如,基本上使用|作为分隔符而不是

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

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

答案

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/:?]
另一答案

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

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

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

另一答案

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

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

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

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

并将模式键添加到模式布局的模式中。

以上是关于如何格式化log4j2中的stacktrace?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Linux 上的 .NET 6 中抛出异常的 StackTrace 中获取行号

log4j2配置

没有 StackTrace 的 Java 中的 NullPointerException

如何将 log4j2 与 spring boot 执行器一起使用

如何获得修复此错误的 Stacktrace?

如何在 Windows Universal 10 App 中无异常地获取 StackTrace