10

私のカスタム例外クラスでは、オーバーライドしました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)) ログに記録すると、出力はバニラの例外と同様になります。

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 です。

4

2 に答える 2

4

手っ取り早い方法は次のとおりです: logger.warn("your_message_here \n{}", err.toString());

より良い方法は、独自のカスタム変換指定子を作成することです ( logback マニュアルを参照して、カスタム エラー処理がアプリケーション コードから抽象化されるようにし、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 を追加すると、通常の例外処理が停止することに注意してください

于 2011-07-18T23:17:08.407 に答える