如何解决覆盖Logback错误输出
| 在我的自定义异常类中,我重写了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。
解决方法
一种快速而肮脏的方式是这样的:
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会停止通常的异常处理
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。