如何在logback中从Java堆栈中删除换行符?

时间:2016-07-30 01:29:17

标签: java regex logback

我试图从Java堆栈中删除换行符。

我遵循了回溯模式 -

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

我希望它能替换消息中的换行符,但它没有这样做。我看到用新行打印出的stacktraces。

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

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

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

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

但是,我只能为appender一次激活一个模式。 我如何确保我不会在stacktraces中获取换行符?

1 个答案:

答案 0 :(得分:11)

在查看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"以表明此处有新行,您可以在'\\n'第二个参数中添加%replace

  • %nopex:我不知道为什么,但如果您在%replace上使用%ex,则Logback会在您的条目中添加第二个堆栈跟踪,这次是全部新线。使用%nopex(参见documentation),它将通过伪造使用没有任何%replace的实际堆栈来抑制第二个堆栈。