【问题标题】:Add something to log if there is an exception in logback如果 logback 中有异常,则添加一些内容进行记录
【发布时间】:2018-04-06 15:41:17
【问题描述】:

由于我无法控制的原因,我必须使用的某些日志记录基础架构无法正确处理换行符。

解决方法是将\n 替换为另一个字符,例如_newline_

这可以通过配置模式在 logback 中完成:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  <encoder>
    <!-- Standard pattern -->
    <!-- <pattern>%coloredLevel - %logger - %message%n%xException{15}</pattern> -->
    <!-- With newlines removed -->
    <pattern>%coloredLevel - %logger - %replace(%message){'\n', '_newline_'}_newline_%replace(%xException){'\n', '_newline_'}%nopex%n</pattern>
  </encoder>
</appender>

但是,如果没有异常,这会在日志行中添加一个多余的 _newline_。 (并在堆栈跟踪中添加了一个额外的换行符,但这不是一个大问题)

有没有办法只在消息和是否有异常之间输出_newline_

【问题讨论】:

  • 再次检查你的行,我认为你有一个错字,你在 %replace(){} 调用之外硬编码 newline ,这意味着它总是被发出。
  • @MichaelLang 正确,但否则日志消息和异常消息/堆栈跟踪之间不会有新行

标签: logback


【解决方案1】:

找到了一个更简单的解决方案,可以在日志消息和异常消息之间有条件地输出换行符。似乎异常消息总是后跟换行符,无论您打印多少行堆栈跟踪。你能做的是打印一个带有 0 行堆栈跟踪 (%ex{0}) 的异常,然后从左侧截断所有字符,直到长度不超过 1 (%.1ex{0})。如果有异常,这将有效地留下\n,并在没有异常的情况下生成空字符串。

所以:

// logger.error("Log message", new RuntimeException("Exception message", new RuntimeException("Cause")));
// logger.error("Log message without exception");

<pattern>%-5p %m%.1ex{0}%ex%nopex%n</pattern>

结果:

ERROR Log message
java.lang.RuntimeException: Exception message
    [ redacted ]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.RuntimeException: Cause
    ... 10 common frames omitted

ERROR Log message without exception

现在有趣的事情。还记得异常总是跟在换行符后面吗?这使得带有异常的日志事件后跟空行(一个来自异常的换行符和一个来自模式的换行符),除非您知道如何仅在没有异常时打印某些内容的技巧...

附:您也可以将所有内容包装在 replace(){} 中以避开换行符:

<pattern>%-5p %replace(%m%.1ex{0}%ex){'[\r\n]+', 'LF'}%nopex%n</pattern>

【讨论】:

  • 虽然我希望有更好的方法来做可选的换行符,但我不得不佩服它的聪明和实用性。谢谢!
【解决方案2】:

我用一个 _newline_ 替换了额外的异常堆栈跟踪,非常巧妙地解决了这个问题

<pattern>%coloredLevel - %logger - %replace(%message){'\n', '_newline_'} %replace(%replace(%ex{0}){'\n',''}){'.+', '&lt;nl&gt;'}%replace(%xException){'\n', '_newline_'}%nopex%n</pattern>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 2021-01-31
    • 2011-09-02
    相关资源
    最近更新 更多