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

18

我想从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)引用堆栈跟踪。

但是,我每次只能使一个模式处于活动状态。 如何确保在堆栈跟踪中不会出现换行符?

1个回答

28

在查看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(请参见文档),它将通过模拟使用没有任何%replace的实际堆栈来抑制此第二个堆栈。


1
如何替换换行符并通过评估子句进行过滤,例如不包括Tomcat软件包。 - Kalpesh Soni
@KalpeshSoni 不确定您所说的“评估子句”的意思,但如果您想要禁用特定包/类的日志,请参见https://dev59.com/llYN5IYBdhLWcg3wdn8Y,如果您想要尝试从日志中删除一些文本,可以多次使用`%replace`,包括在同一日志条目字段上(请参见https://dev59.com/4a3la4cB1Zd3GeqPGQvi)。 - xav
不要禁用日志,而是过滤堆栈跟踪。https://dev59.com/qFsW5IYBdhLWcg3wVmKV - Kalpesh Soni
1
我认为%nopex的行为方式已经发生了一些变化,或者那时候它实际上是一个错误。当我尝试使用logback-classic v1.2.3进行操作时,它根本不会打印任何ERROR日志。但是,当我删除%nopex符号时,它会将相同的ERROR日志打印两次(一个替换了换行符,另一个则完全保持原样)。 - emrekgn
@emrekgn,你是如何解决%nopex问题并防止重复日志的? - Vishakha Lall
1
@VishakhaLall 我无法修复它。我相当确定某些版本中存在一个错误。相反,我最终使用logstash-logback-encoder来打印JSON格式的单行日志字符串。(我的要求是为日志收集器 - fluentd - 配置日志,所以这对我来说是最轻松的解决方案。) - emrekgn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接