如果在logback中有异常,请添加一些内容进行记录

时间:2017-10-30 15:06:06

标签: logback

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

解决方法是将\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_和是否存在异常?

2 个答案:

答案 0 :(得分: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

现在有趣的事情。还记得新行一直遵循异常的事实吗?这使得带有异常的日志事件后面跟着空行(一个来自异常的换行符和一个来自模式的换行符),除非你知道如何在没有异常的情况下打印某些东西......

P.S。您可以将replace(){}中的所有内容包装起来以逃避换行:

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

答案 1 :(得分:0)

我通过用一个_newline_

替换额外的异常堆栈跟踪来解决它。
<pattern>%coloredLevel - %logger - %replace(%message){'\n', '_newline_'} %replace(%replace(%ex{0}){'\n',''}){'.+', '&lt;nl&gt;'}%replace(%xException){'\n', '_newline_'}%nopex%n</pattern>