除非打开调试级别,否则 Weld CDI 不会记录异常

Weld CDI does not log exceptions unless debug level is switched on

我们注意到,如果在处理 CDI 事件时抛出异常 - 例如使用 @Observes(during = TransactionPhase.BEFORE_COMPLETION) - 如果日志级别高于 DEBUG,则不会记录异常。

Weld logs 像这样简单的东西:

16:31:41,732 ERROR [org.jboss.weld.Event] WELD-000401 Failure while notifying an observer of event SomeEventDTO

来自 Weld 的 DeferredEventNotification 的第 85-86 行显示了问题:https://github.com/weld/core/blob/master/modules/jta/src/main/java/org/jboss/weld/module/jta/DeferredEventNotification.java

    } catch (Exception e) {
        EventLogger.LOG.asyncObserverFailure(metadata);
        EventLogger.LOG.catchingDebug(e);
    }

这是因为规范说不需要记录异常及其堆栈跟踪,还是因为 Weld 在处理异常时相当(太)放松了。

有没有比用 try-catch 块包装所有事件观察代码更好的解决方案?

注意:将 org.jboss.weld.Event 的标准日志级别设置为 DEBUG 会导致日志记录过多。每个发送的事件也被记录:

17:47:14,088 DEBUG [org.jboss.weld.Event] WELD-000400 Sending event SomeEventDTO directly to observer [method] public com.foo.bar.BeanClass.methodName(SomeEventDTO)

现在我明白了你的问题(抱歉之前的困惑),让我解释一下。

该错误消息似乎是 Weld 故意隐藏的。对日志记录没有任何规范限制。就异常而言,规范仅描述了什么应该爆炸以及何时爆炸。

此外,您使用的是 Weld JTA 模块,我认为它不符合任何 CDI 规范部分(意思是它的 Weld-specific),所以它可能在那里没有发言权。

现在是解决方案,我认为您对日志记录的看法很公平,但它并没有真正帮助。因此,我继续创建了一个 JIRA issue (WELD-2330)。由于这是 3.x 分支,因此应该很快修复。欢迎加入并发表意见,甚至做出贡献。