回退模式 - 如果消息不包含单词,请进行替换

时间:2015-02-21 23:28:07

标签: regex logback

这是How to prevent logback/slf4j from parsing a new line character

的后续问题

我使用以下模式来避免字符串\ n突破新行。但是在使用这个模式之后,我的堆栈跟踪在开头会出现\ n看起来很尴尬。

<pattern>[%d{dd MMM yyyy HH:mm:ss,SSS}] [%5p] [%X{sid}] [%-20C{0} %25M]:[%-4L] - %replace(%m){'\n', '\\n'}%n</pattern>

结果stacktrace:

[21 Feb 2015 23:14:24] [ERROR] [21181422764] [myclass mymethod]:[221] - Socket exception occured while sending request for user. Stacktrace:= java.net.ConnectException: Connection refused: connect
\n  at java.net.DualStackPlainSocketImpl.connect0(Native Method)

我要更改替换以仅匹配那些没有“异常”字样的%m。不知道如何在模式中实现这一点。此外,我担心这种整体匹配和替换如何增加记录时间成本以及是否可接受的成本。

1 个答案:

答案 0 :(得分:1)

看起来您将手动格式化异常作为消息的一部分,但如果您将异常作为日志调用的参数包含在内,则logback会为您执行此操作(请参阅SLF4J API)。我建议使用该API,而不是尝试将其包含在您的邮件中。

final Logger log = LoggerFactory.getLogger(Foo.class);
try {
    // ...
} catch (IOException e) {
    log.error("Socket exception occurred while sending request for user.", e);
}

如果您关注性能,请注意默认情况下,对于堆栈跟踪中的每个方法,logback都包含packaging information,这可能很昂贵,尤其是在您的应用程序经常记录异常时。要跳过包信息查找,请将%ex附加到模式布局。

在你的例子中:

<pattern>... %replace(%m){'\n', '\\n'}%n%ex</pattern>