Jat*_*tin 5 logging log4j stack-trace log4j2
默认情况下,log4j2在多行上打印stacktrace,以newline字符分隔.就像是:
java.lang.NullPointerException: error enovountered
at ...
at ...
at ...
Run Code Online (Sandbox Code Playgroud)
我希望我的堆栈跟踪在一行上,就像,基本上|用作分隔符而不是\n
java.lang.NullPointerException: error enovountered at ... | at ... | at ...
Run Code Online (Sandbox Code Playgroud)
我如何在log4j2中完成这样的事情?
该PatternLayout文件没有提到这一点,但在%throwable转换键的家庭实际上支持能够改变用于单独的堆栈跟踪元素的分离,以及"原因"的例外.它似乎也不是一个新功能,因为它似乎已存在至少4年,假设我没有误读文件历史记录.
鉴于如下模式:
[%threadName] %-5level %logger{36} - %message{nolookups}%xThrowable{separator(|)}%n
Run Code Online (Sandbox Code Playgroud)
你会得到如下输出:
[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/:?]
Run Code Online (Sandbox Code Playgroud)
上面的答案包含配方。我在这里添加示例:
<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>
Run Code Online (Sandbox Code Playgroud)
如果您跳过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
并将您的模式键添加到模式布局的模式中。