2016-03-04 3 views
1

По умолчанию log4j2 печатает stacktrace на нескольких строках, разделенных newline символами. Что-то вроде:Как форматировать stacktrace в log4j2?

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

Я хочу, чтобы мой StackTrace на одной линии, что-то вроде, по сути, используя | в качестве разделителя, а не \n

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

Как я сделать что-то подобное в log4j2?

ответ

0

alwaysWriteExceptions атрибут шаблона шаблона для фальшивого.

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, стек будет появляться дважды - один раз линеаризованной и один раз в несколько строк.

Смежные вопросы