由于我无法控制的原因,我必须使用的某些日志记录基础结构无法正确处理换行符。
解决方法是将\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_
和是否存在异常?
答案 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',''}){'.+', '<nl>'}%replace(%xException){'\n', '_newline_'}%nopex%n</pattern>