覆盖Logback错误输出

时间:2011-04-13 14:45:20

标签: java exception-handling slf4j logback printstacktrace

在我的自定义异常类中,我覆盖了toString()

@Override
public String toString() {
    final String msg = getLocalizedMessage();

    // base
    String str = getClass().getName() + ": [" + code + "]";

    // message
    if (msg != null)
        str += " " + msg;

    // extra
    if (extra != null) {
        str += '\n' + extra.toString();
    }

    return str;
}

(是的,我知道我应该使用StringBuilder

但是,当我记录这样的异常(通过org.slf4j.Logger.warn(String msg, Throwable err))时,输出与vanilla异常一样:

webersg.util.service.ServiceError: null
    at webersg.util.service.ServiceTools.decodeException(ServiceTools.java:39) ~[bin/:na]
    at tr.silvercar.rummikub.robot.LobbyConnection.sendRequestTo(LobbyConnection.java:143) ~[bin/:na]
    at tr.silvercar.rummikub.robot.LobbyConnection.sendRequest(LobbyConnection.java:98) ~[bin/:na]
    at tr.silvercar.rummikub.robot.Robot.<init>(Robot.java:32) ~[bin/:na]
    at tr.silvercar.rummikub.robot.RobotController.start(RobotController.java:81) ~[bin/:na]
    at tr.silvercar.rummikub.robot.runners.LocalAltinRobot.main(LocalSilverRobot.java:132) [bin/:na]

如何才能显示我的额外数据?我的日志实现是Logback。

2 个答案:

答案 0 :(得分:3)

这是一种快速而肮脏的方式: logger.warn(“your_message_here \ n {}”,err.toString());

更好的方法是编写自己的自定义转换说明符(请参阅logback manual,以便从应用程序代码中抽象出自定义错误处理,并且可以通过logback中的自定义转换字配置它的使用。 xml。

这是一个简单的例子,可以完成您的工作:

package com.example.logging;

import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.ThrowableProxy;

/**
 * Simple exception converter.
 *
 */
public class MyExceptionConverter extends ClassicConverter {
    /* (non-Javadoc)
     * @see ch.qos.logback.core.pattern.Converter#convert(java.lang.Object)
     */
    @Override
    public String convert(ILoggingEvent event) {
        IThrowableProxy itp = event.getThrowableProxy();
        if (itp instanceof ThrowableProxy) {
            ThrowableProxy tp = (ThrowableProxy)itp;
            return tp.getThrowable().toString();
        }

        return "";
    }
}

然后在你的logback.xml中你需要像这样引用它:

  <conversionRule conversionWord="myCon"
              converterClass="com.example.logging.MyExceptionConverter" />

然后在编码器模式中使用%myCon:

<encoder>
    <pattern>%d{dd MMM yyyy HH:mm:ss.SSS} %logger{0}: %myCon %nopex%n</pattern>
</encoder>

请注意,添加%nopex会停止常规异常处理

答案 1 :(得分:0)

我遇到了同样的问题。Logback.error 调用异常的 getMessage 方法。 覆盖该方法是另一种方式。

@Override
public String getMessage() {
    return toString();
}