如何限制日志中的堆栈跟踪显示?

时间:2018-03-21 03:41:49

标签: logback slf4j slf4j-api

我在slf4j-api 1.7.7上使用logback 1.1.3。

我正在阅读以下文档here

我试图限制日志记录日志并以下列方式抛出异常的代码(我无法修改)。

try {.. }
catch( Exception e ) {
  log.error( "Houston we have a problem", e );
  throw new TestException( "Houston we have a problem", e );
}

我使用的日志格式如下。

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern>
            %d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n
        </Pattern>
    </layout>
</appender>

我想让一些记录器将他们的堆栈跟踪显示限制为只有2行,所以我想我可以简单地将其修改为文档中规定的以下格式。

<appender name="STDOUT_COMPACT" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern>
            %ex{2} %d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n
        </Pattern>
    </layout>
</appender>

我期待得到以下内容。

mainPackage.foo.bar.TestException: Houston we have a problem
  at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)

但相反,我得到了以下内容。

mainPackage.foo.bar.TestException: Houston we have a problem
  at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)
mainPackage.foo.bar.TestException: Houston we have a problem
  at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)
  at mainPackage.foo.bar.TestThrower.fire1(TestThrower.java:12)
  at mainPackage.foo.bar.TestThrower.fire2(TestThrower.java:44)
  at mainPackage.foo.bar.TestThrower.fire3(TestThrower.java:122)
  at mainPackage.foo.bar.TestThrower.fire4(TestThrower.java:322)
  at mainPackage.foo.bar.TestThrower.fire5(TestThrower.java:72)
  ..

简单地重复日志而不是截断为仅仅2行。我究竟做错了什么?我究竟如何恰当地使用ex{n}格式?我不喜欢为此编写自定义记录器。

1 个答案:

答案 0 :(得分:0)

您必须在模式中包括%nopex。否则,即使您已经打印了堆栈跟踪,Logback也会添加到堆栈跟踪上。您的模式应如下所示:

   var x = 0
//Request loop start requesting items of each order and pushing in array
function reqOrders(body) {
    let responseJSON = JSON.parse(body);
    if (x>=responseJSON.results.length) {
       reqEnd();
    } else {
        rp(URI)
        .then(data =>{
            const order = JSON.parse(data)
            itemID.push(order.order_items.item.id)
            reqProducts(body) //call second fuction in loop
        })
        .catch(e=>{
            console.log("Erro ref99: "+e)
        })

    }
}
//loop sequence requesting items data
function reqProducts(body) {
        rp(URI,{
            data: x++
        })
        .then(data =>{
            const item = JSON.parse(data)
            itemPic.push(item.thumbnail)
            //Push item and emit to front-end
            if(productName.push(item.title)){
                req.app.io.emit(itemPic[0]);
            }
            i++;
            reqOrders(body) //call first func again
        })
        .catch(e=>{
            console.log("Erro ref88: "+e)
        })       
}
//First request to get  all orders
rp(URI)
.then(body => {
    reqOrders(body)
})
.catch(e => {
    console.log("error"+e)
})


//Jquery on front-end
 $(function () {
    var socket = io();
    socket.on('receive item', function(msg){
        var x = JSON.stringify(msg);
        $(".div").append(msg);
    });
});

更常见的是,像这样在末尾包含异常:

%ex{2} %d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%nopex%n