Logback - Как записать простое имя исключения отдельно - PullRequest
0 голосов
/ 26 сентября 2018

Можно ли как-нибудь зарегистрировать только простое имя исключения без явного извлечения его из кода?

Например, позвонив

log.error(exception);

с шаблоном регистрации

%d{yyyy-MM-dd}|%-5level|%m%n

вместо простого ведения журнала трассировки стека исключений

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)

Ожидается, что отдельный столбец с простым именем исключения будет зарегистрирован

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)

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Вы можете написать свой собственный пользовательский спецификатор преобразования .

. Для этого вы должны объявить правило преобразования в вашем logback.xml для символа %exname следующим образом:

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

    ...

</configuration>

Затем объявите 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();
    }
}

Теперь, используя этот шаблон:

%d{yyyy-MM-dd}|%-5level|%exname|%m%n

Следующий оператор журнала:

logger.error("Boom!", new RuntimeException("ouch"));

будет излучать:

2018-09-26|ERROR|java.lang.RuntimeException|Boom!
0 голосов
/ 26 сентября 2018

Как предполагает Андреас, одним из способов поддержки регистрации имен исключений является использование пользовательского Layout вместо PatternLayout

Пример макета:

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.ThrowableProxyUtil;
import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.LayoutBase;

public class ErrorLoggingLayout extends LayoutBase<ILoggingEvent> {

    private static final char SEP = '|';

    @Override
    public String doLayout(final ILoggingEvent event) {
        StringBuilder sb = new StringBuilder(128);
        sb.append(event.getTimeStamp() - event.getLoggerContextVO().getBirthTime());
        sb.append(SEP);
        sb.append(event.getLevel());
        sb.append(SEP);
        sb.append(event.getThreadName());
        sb.append(SEP);
        StackTraceElement frame = event.getCallerData()[0];
        sb.append(extractSimpleName(frame.getClassName())).append('.').append(frame.getMethodName()).append(':').append(frame.getLineNumber());
        sb.append(SEP);
        IThrowableProxy throwableProxy = event.getThrowableProxy();
        if (throwableProxy != null) {
            String simpleName = extractSimpleName(throwableProxy.getClassName());
            sb.append(simpleName);
        }
        sb.append(SEP);
        sb.append(event.getFormattedMessage());
        sb.append(CoreConstants.LINE_SEPARATOR);
        if (throwableProxy != null) {
            sb.append(ThrowableProxyUtil.asString(throwableProxy));
        }
        return sb.toString();

    }

    @NotNull
    private String extractSimpleName(final String cName) {
        int index = cName.lastIndexOf('.');
        return cName.substring(index + 1);
    }
}

Этот результат получаетсякак

7645|ERROR|Thread-Name-0|RocketConsole.report:22|RocketExplosionException|custom msg
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)

Однако один недостаток этого подхода заключается в том, что формат вывода может немного отличаться от исходного шаблона, и для форматирования полей требуются дополнительные усилия.

...