无法使用Logback记录未捕获的异常

Gav*_*avi 5 logback uncaught-exception

我用各种框架(jsf,Spring,Hibernate)编写了一个web应用程序,我的logger库是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>
Run Code Online (Sandbox Code Playgroud)

当我用uc = null执行这几行代码时

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

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

        LOG.debug("<<login(uc)");
    }
Run Code Online (Sandbox Code Playgroud)

在logFile我只看到

>>login(uc)
Run Code Online (Sandbox Code Playgroud)

但是我想看看NullPointer的stackTrace.怎么了?

bre*_*leq 2

您可以使用SLF4JBridgeHandler

本质上,这个想法是在根记录器上安装 SLF4JBridgeHandler 的实例作为系统中唯一的 JUL 处理程序。随后,SLF4JBridgeHandler 实例将重定向所有 JUL 日志记录,并重定向到基于 SLF4J API 的

基本上你只需要调用SLF4JBridgeHandler.install(); 在你的 main 方法中并以这种方式配置 logback:

<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
    <resetJUL>true</resetJUL>
</contextListener>
Run Code Online (Sandbox Code Playgroud)

  • 我不确定是否理解:这个“SLF4JBridgeHandler”是否注册了“Thread.UncaughtExceptionHandler”的实例并调用“Thread.setUncaughtExceptionHandler()”?如果不是,那么未捕获的异常是在何时/何处实际捕获的? (2认同)