如何从 logback 中的 Java stacktraces 中删除换行符?

How do I remove newline from Java stacktraces in logback?

我正在尝试从 Java 堆栈跟踪中删除换行符。

我遵循了 logback 模式 -

<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %replace(%msg){'\n', ''}%n</pattern>

我希望它能替换消息中的换行符,但它并没有这样做。我看到用换行符打印出来的堆栈跟踪。

但是,如果我使用以下模式(仅用于测试目的)-

<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %replace(%msg){'.*', 'x'}%n</pattern>

我发现消息被替换为字符 x,但堆栈跟踪仍按原样打印。

这让我相信 logback 会独立处理堆栈跟踪。 我已经阅读了 logback 文档,它说可以通过 (%ex) 引用 stacktraes。

但是,对于 appender,我一次只能激活一个模式。 我该如何确保我不会在堆栈跟踪中换行?

在查看了 Logback 格式化程序如何在我的 Windows 框中构建字符串后,我看到堆栈跟踪包含每个新行的 \r\n,因此如果您使用 Windows ,试试这个:

<pattern>........ %replace(%ex){'[\r\n]+', '\n'}%nopex%n</pattern>

解释:

  • \r\n :起初我只尝试使用 %replace(%ex){'\n', 'X'} 但后来我在日志中有了换行符然后是 'X'。相反,使用 %replace(%ex){'[\r\n]+', ''} 会删除所有出现的 \r\n。如果要显示字符串 "\n" 以表示此处换行,可以在 %replace 第二个参数中添加 '\n'

  • %nopex :我不知道为什么,但是如果你在 %ex 上使用 %replace,Logback 会在你的条目中添加第二个堆栈跟踪,这所有新线路的时间。使用 %nopex(参见 documentation),它将通过伪造使用没有任何 %replace.

  • 的实际堆栈来抑制第二个堆栈