Logback-筛选堆栈跟踪



我使用logback进行日志记录,发现过滤堆栈跟踪有一些问题。我有一个这样的结构:

public class Main {
    static final Logger logger = (Logger) LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        logger.debug("Start");
        MyObject1 loggingElement = new MyObject1();
        loggingElement.logg();
        logger.debug("End");
    }
}

public class MyObject1 {
    public MyObject2 obj;
    static final Logger logger = (Logger) LoggerFactory.getLogger(MyObject1.class);
    public MyObject1() {
        obj = new MyObject2();
    }
    public void logg() {
        obj.loggError();
    }
}
public class MyObject2 {
    static final Logger logger = (Logger) LoggerFactory.getLogger(MyObject2.class);
    public void loggError() {
        logger.error("Error info", new Throwable("Error"));
    }
}

和像这样的配置xml:

<property name="mask" 
            value="MyObject2"/>

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{HH:mm:ss} | %level | %-4thread | %-21logger | %m%n
        </pattern>
    </encoder>
</appender>
<root level="${root.level:-TRACE}">
    <appender-ref ref="STDOUT" />
</root>

当我运行主方法时,我得到的输出如下:

12:29:35 | DEBUG | main | com.logging.Main      | Start
12:29:35 | ERROR | main | com.logging.MyObject2 | Error info
java.lang.Throwable: Error
    at com.logging.MyObject2.loggError(MyObject2.java:11) [bin/:na]
    at com.logging.MyObject1.logg(MyObject1.java:17) [bin/:na]
    at com.logging.Main.main(Main.java:14) [bin/:na]
12:29:35 | DEBUG | main | com.logging.Main      | End

我想删除其中带有"MyObject1"的行,并像int一样保留堆栈跟踪的其余部分:http://java.dzone.com/articles/filtering-stack-trace-hell

我试图更改logback 的配置

<pattern>%d{HH:mm:ss} | %level | %-4thread | %-21logger | %m%n%ex{full,${mask}}
</pattern>

根本不起作用

<pattern>%d{HH:mm:ss} | %level | %-4thread | %-21logger | %m%n%eXe{full,${mask}}
            </pattern>

删除整个堆栈跟踪(不是我的解决方案)

有人知道有什么可以帮助的吗?

此功能已包含在1.1.3版的Logback Classic中。它似乎适用于以下模式布局的转换词:

  • ex/异常/可丢弃
  • rEx/rootException
  • xEx/xException/xThrowable

在我的案例中,我使用了一个ThrowableConverter作为堆栈。

你可以把它添加到你的logback.xml中,在那里你有你的consolepender,在你的编码器里:

    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <!-- your other encoder configurations -->
            <stackTrace>
                <fieldName>stacktrace</fieldName>
                <throwableConverter class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
                    <pattern>[%thread] - %msg%n%stack{1,1024,10,rootFirst}</pattern>
                </throwableConverter>
            </stackTrace>
        </encoder>
    </appender>

它将在堆栈跟踪中添加一个字段名"stack_trace"。它为我完成了任务。

堆栈内部有参数:

  • maxDepthPerThrowable:限制每个可丢弃的stackTraceElements的数量
  • maxLength:限制跟踪的总长度(以字符为单位)
  • shortenedClassNameLength:基于shortenedClassName的类名缩写
  • rootCauseFirst:按"正常"顺序输出(最后是根本原因)或首先是根本原因

最新更新