【问题标题】:Unable to log Uncaught exceptions with Logback无法使用 Logback 记录未捕获的异常
【发布时间】:2026-01-13 23:00:02
【问题描述】:

我用各种框架(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)

但我想查看 NullPointer 的 stackTrace。怎么了?

【问题讨论】:

    标签: logback uncaught-exception


    【解决方案1】:

    你可以使用SLF4JBridgeHandler:

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

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

    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
        <resetJUL>true</resetJUL>
    </contextListener>
    

    【讨论】:

    • 我不确定:这个“SLF4JBridgeHandler”是否注册了Thread.UncaughtExceptionHandler 的实例并调用Thread.setUncaughtExceptionHandler()?如果没有,什么时候/在哪里实际捕获了未捕获的异常?
    最近更新 更多