【问题标题】:Override Logback error output覆盖 Logback 错误输出
【发布时间】:2011-08-04 19:11:55
【问题描述】:

在我的自定义异常类中,我已覆盖 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。

【问题讨论】:

    标签: java exception-handling slf4j logback printstacktrace


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      一个快速而肮脏的方法是这样的: 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 会停止通常的异常处理

      【讨论】:

      • 您应该从 ThrowableHandlingConverter 扩展(而不是从 ClassicConverter 扩展)。那么你也不需要 %nopex hack。而且,如果你想打印堆栈跟踪,%myCon 应该在 %n 之后。
      • 我将 IThrowableProxy 设置为使用 spring boot 的 java.sql.SQLSyntaxErrorException 的 null
      猜你喜欢
      • 2014-07-02
      • 2017-11-05
      • 2021-08-12
      • 1970-01-01
      • 2018-05-31
      • 2019-08-18
      • 1970-01-01
      • 2016-11-19
      • 2013-08-23
      相关资源
      最近更新 更多