2016-03-04 214 views
1

默認情況下,log4j2在多行上打印堆棧跟蹤,由newline個字符分隔。喜歡的東西:如何在log4j2中格式化堆棧跟蹤?

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

我想我在一行堆棧跟蹤,類似的東西,實質上是使用|作爲分隔符,而不是\n

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

我將如何實現在log4j2這樣的事情?

回答

0

設置alwaysWriteExceptions模式佈局的屬性爲false。

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

寫自己的異常轉換器,你希望將格式化例外。

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

,並添加您的圖案鑰匙圖案佈局的模式。

+0

看起來像'alwaysWriteExceptions'不會寫stacktrace,這不是我想要的行爲。從文檔中,_「將此設置爲false將禁用此行爲,並允許您從模式輸出中排除例外。」_ 另外,我不使用'PatternLayout',所以不確定是否也可以使用PatternConverter。 – Jatin

+0

總是寫入異常會在日誌模式的末尾添加一個默認轉換器。你使用什麼樣的佈局? – alan7678

2

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/:?] 
0

上面的答案包含的配方。在這裏,我加入例如:

<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參數,堆棧會出現兩次 - 一次線性化,一次多線。