Logback - 过滤堆栈跟踪信息

6

我正在使用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”所在的行删除,并保留其余的堆栈跟踪,就像这个例子一样: 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>

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

有人知道能帮忙的东西吗?


你是使用文章中提到的fork版本还是标准的logback jar包?Logback目前还不支持这个功能,可以在这里查看相关的开放问题。 - gresdiplitude
我不是很关心分叉,但你的回答解除了我的困惑,谢谢。 - viniolli
2个回答

6

2

在我的情况下,我使用了一个ThrowableConverter来处理堆栈跟踪。

你可以将它添加到logback.xml中,在你的consoleApender内部,编码器中:

    <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:限制每个throwable的stackTraceElements数量
  • maxLength:限制跟踪的总长度(以字符为单位)。
  • shortenedClassNameLength:根据shortenedClassName缩写类名称
  • rootCauseFirst:以正常顺序(最后原因)或从根本原因开始输出

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接