Logback配置在一行上有例外?

khe*_*aud 5 java logging logback slf4j

我的日志被提取,管道并合并到elasticsearch中.多线事件很难跟踪和诊断.

而不是使用收集器和正则表达式来组合单个记录中的异常行,是否有一种方法可以使用logback配置Exception堆栈跟踪放在一行上?

gly*_*ing 7

您可以logback.xml%ex符号中声明转换规则,如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <conversionRule conversionWord="ex" converterClass="com.foo.CompressedStackTraceConverter" /> 

    ...

</configuration>
Run Code Online (Sandbox Code Playgroud)

然后声明CompressedStackTraceConverter如下:

import ch.qos.logback.classic.pattern.ThrowableProxyConverter;
import ch.qos.logback.classic.spi.IThrowableProxy;

public class CompressedStackTraceConverter extends ThrowableProxyConverter {
    @Override
    protected String throwableProxyToString(IThrowableProxy tp) {
        String original = super.throwableProxyToString(tp);

        // replace the new line characters with something, 
        // use your own replacement value here
        return original.replaceAll("\n", " ~~ ");
    }
}
Run Code Online (Sandbox Code Playgroud)

只要您的日志记录模式包含符号,此自定义转换说明符就会起作用%ex.例如,这样的模式:

<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <pattern>%d{yyyy-MM-dd HH:mm:ss}|%-5level|%logger{36}|%msg %ex %n</pattern>
</encoder>
Run Code Online (Sandbox Code Playgroud)

如果你的模式并没有包括%ex象征性的,则堆栈跟踪是部分%msg在这种情况下,你会宣布这样的转换规则...

<conversionRule conversionWord="msg" converterClass="com.foo.CompressedStackTraceConverter" /> 
Run Code Online (Sandbox Code Playgroud)

...虽然这会产生应用于CompressedStackTraceConverter整个日志消息的效果,而不仅仅是它的堆栈跟踪部分.