Невозможно зарегистрировать неперехваченные исключения с помощью Logback

Я написал веб-приложение с различными фреймворками (jsf, Spring, Hibernate), а моя библиотека логгеров - Logback и slf4j.

На данный момент я не могу отображать неперехваченные исключения (например, NullPointers) в файле журнала.

Это мой logBack.xml

<configuration debug="true">
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${CATALINA_HOME}/logs/jsfDemo.log</file>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>jsfDemo.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender> 

    <root level="DEBUG">         
        <appender-ref ref="FILE" />
    </root> 

</configuration>

когда я выполняю эти несколько строк кода с uc = null

public void nullPointerMethod(UserCredential uc){
        LOG.debug(">>login(uc)");

        if(uc == null){
            throw new NullPointerException();
        }else{
            //do something
        }

        LOG.debug("<<login(uc)");
    }

в файле журнала я вижу только

>>login(uc)

но я хочу увидеть stackTrace из NullPointer. Что случилось?


person Gavi    schedule 23.04.2014    source источник


Ответы (1)


Вы можете использовать SLF4JBridgeHandler:

По сути, идея состоит в том, чтобы установить в корневом регистраторе экземпляр SLF4JBridgeHandler в качестве единственного обработчика JUL в системе. Впоследствии экземпляр SLF4JBridgeHandler перенаправит все записи журнала JUL, которые будут перенаправлены на API SLF4J на основе

По сути, вам нужно только вызвать SLF4JBridgeHandler.install (); в основном методе и настроить логбэк следующим образом:

<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
    <resetJUL>true</resetJUL>
</contextListener>
person brevleq    schedule 09.07.2014
comment
Я не уверен, что понимаю: регистрирует ли этот SLF4JBridgeHandler экземпляр Thread.UncaughtExceptionHandler и вызывает Thread.setUncaughtExceptionHandler()? Если нет, то когда / где на самом деле перехватываются неперехваченные исключения? - person xav; 11.08.2017