Logback 模式 - 如果消息不包含单词则进行替换

Logback pattern - do replace if message doesn't contain a word

这是

的后续问题

我使用以下模式来避免带有 \n 的字符串换行。但是在使用这个模式之后,我的堆栈跟踪在开始时出现了 \n ,这看起来很尴尬。

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

结果堆栈跟踪:

[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)

我必须更改替换以仅匹配那些没有 "Exception" 单词的 %m。不确定如何以模式完成此操作。另外,我担心这种整体匹配和替换如何增加记录时间成本,以及它是否可以接受。

您似乎是在手动将异常格式化为消息的一部分,但如果您将异常作为日志调用的参数包含在内,则 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 for each method in the stacktrace, which could be expensive, especially if your application frequently logs exceptions. To skip the package-info lookup, append %ex 包含到您的模式布局中。

在你的例子中:

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