代码之家  ›  专栏  ›  技术社区  ›  kheraud

是否将Logback配置为在单行上有异常?

  •  8
  • kheraud  · 技术社区  · 7 年前

    我的日志被提取、管道化并整合到elasticsearch中。多行事件很难跟踪和诊断。

    有没有办法用 logback configuration 拥有 Exception stacktrace在单行上?

    1 回复  |  直到 7 年前
        1
  •  13
  •   glytching    7 年前

    您可以在 logback.xml 对于 %ex 象这样的符号:

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

    然后声明 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", " ~~ ");
        }
    }
    

    custom conversion specifier 只要日志模式包含 %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>
    

    如果你的模式 包括 %ex公司 符号则stacktrace是 %msg 在这种情况下,您可以这样声明转换规则。。。

    <conversionRule conversionWord="msg" converterClass="com.foo.CompressedStackTraceConverter" /> 
    

    ... 虽然这会产生应用 压缩跟踪转换器 发送到整个日志消息,而不仅仅是其中的堆栈跟踪部分。