【问题标题】:How to format stacktrace in log4j2?如何在 log4j2 中格式化堆栈跟踪?
【发布时间】:2016-06-17 19:15:14
【问题描述】:

默认情况下,log4j2 在多行上打印堆栈跟踪,以newline 字符分隔。比如:

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

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

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

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

【问题讨论】:

  • 为什么?使用 GELF appender 和像 graylog 这样的日志消费者可以使用它。然后你把你的堆栈跟踪作为一个对象。

标签: logging log4j log4j2 stack-trace


【解决方案1】:

正如PatternLayout documentation 指定的那样,%throwable 系列转换键实际上是support being able to change the separator used for individual stack trace elements, as well as the "cause" exceptions

给定这样的模式:

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

【讨论】:

    【解决方案2】:

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

    <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 参数,堆栈将出现两次 - 一次是线性化,一次是多行。

    【讨论】:

    • 我用logback也遇到了同样的问题,不知道有没有什么参数可以避免在使用logback时在loghost上打印两次?
    【解决方案3】:

    将图案布局的alwaysWriteExceptions属性设置为false。

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

    编写您自己的异常转换器,它将按照您的意愿格式化异常。

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

    并将您的图案键添加到图案布局的图案中。

    【讨论】:

    • 好像alwaysWriteExceptions 不会写stacktrace,这不是我想要的行为。从文档中,“将此设置为 false 会禁用此行为,并允许您从模式输出中排除异常。” 另外,我使用PatternLayout,所以不确定我是否也可以使用 PatternConverter。
    • 始终写入异常会在日志模式的末尾添加一个默认转换器。您使用的是哪种布局?
    【解决方案4】:

    includeStacktrace 用于JsonLayout

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多