【问题标题】:How do I remove newline from Java stacktraces in logback?如何从 logback 中的 Java 堆栈跟踪中删除换行符?
【发布时间】:2016-07-30 01:29:17
【问题描述】:

我正在尝试从 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,我一次只能激活一个模式。 如何确保在堆栈跟踪中没有换行符?

【问题讨论】:

    标签: java regex logback


    【解决方案1】:

    在查看了 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 的实际堆栈来抑制第二个堆栈。

    【讨论】:

    • 如何替换新行并通过评估子句过滤,例如不包括 tomcat 包
    • @KalpeshSoni 不确定您所说的 "evaluate Clause" 是什么意思,但如果您想禁用特定包/类的日志,请参阅 stackoverflow.com/questions/47397442,如果您想尝试从可以多次使用%replace 的日志中删除一些文本,包括在同一个日志条目字段中(请参阅stackoverflow.com/questions/51441574
    • 不禁用日志,但过滤堆栈跟踪stackoverflow.com/questions/35076096/…
    • 我认为%nopex 的行为以某种方式发生了变化,或者它当时实际上是一个错误。当我尝试使用 logback-classic v1.2.3 时,它根本不会打印任何 ERROR 日志。但是当我删除 %nopex 符号时,它会打印两次相同的 ERROR 日志(一个用替换的换行符,另一个用原样)
    • @VishakhaLall 我无法修复它。我很确定某些版本中存在错误。相反,我最终使用 logstash-logback-encoder 打印 JSON 格式的单行日志字符串。 (我的要求是为日志收集器配置日志 - fluentd - 所以这对我来说是最轻松的解决方案。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多