Logback - 如何单独记录异常的简单名称

Pro*_*tle 4 java logging spring logback slf4j

有没有什么方法可以只记录异常的简单名称,而无需从代码中显式检索它?

例如,通过调用

log.error(exception);
Run Code Online (Sandbox Code Playgroud)

使用 logback 模式

%d{yyyy-MM-dd}|%-5level|%m%n
Run Code Online (Sandbox Code Playgroud)

而不是仅仅记录异常堆栈跟踪

2018-01-01|ERROR|
mainPackage.foo.bar.RocketExplosionException: Houston we have a problem
  at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)
  at mainPackage.foo.bar.TestThrower.readyToLaunch(TestThrower.java:17)
  at mainPackage.ExceptionLauncher.main(ExceptionLauncher.java:38)
Run Code Online (Sandbox Code Playgroud)

预计将记录一个包含异常简单名称的单独列

2018-01-01|ERROR|RocketExplosionException|
mainPackage.foo.bar.RocketExplosionException: Houston we have a problem
  at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)
  at mainPackage.foo.bar.TestThrower.readyToLaunch(TestThrower.java:17)
  at mainPackage.ExceptionLauncher.main(ExceptionLauncher.java:38)
Run Code Online (Sandbox Code Playgroud)

gly*_*ing 5

您可以编写自己的自定义转换说明符

为此,您需要在符号中声明一个转换规则,logback.xml如下%exname所示:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <conversionRule conversionWord="exname" converterClass="com.foo.ExceptionNameConverter" />

    ...

</configuration>
Run Code Online (Sandbox Code Playgroud)

ExceptionNameConverter然后像这样声明:

import ch.qos.logback.classic.pattern.ThrowableProxyConverter;
import ch.qos.logback.classic.spi.IThrowableProxy;

public class ExceptionNameConverter extends ThrowableProxyConverter {
    @Override
    protected String throwableProxyToString(IThrowableProxy tp) {
        return tp.getClassName();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,使用这个模式:

%d{yyyy-MM-dd}|%-5level|%exname|%m%n
Run Code Online (Sandbox Code Playgroud)

日志语句如下:

logger.error("Boom!", new RuntimeException("ouch"));
Run Code Online (Sandbox Code Playgroud)

会发出:

2018-09-26|ERROR|java.lang.RuntimeException|Boom!
Run Code Online (Sandbox Code Playgroud)