Мы заметили, что если исключение генерируется, когда события CDI обрабатываются - например, с @Observes(during = TransactionPhase.BEFORE_COMPLETION)
- тогда исключение не регистрируется, если уровень журнала выше DEBUG
.Weld CDI не регистрирует исключения, если уровень отладки не включен
Weld записывает что-то простое, как это:
16:31:41,732 ERROR [org.jboss.weld.Event] WELD-000401 Failure while notifying an observer of event SomeEventDTO
Линии 85-86 в DeferredEventNotification
от Weld показать проблему: 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);
}
Является ли это потому, что данные говорят исключение и его StackTrace не нужно регистрировать, или это потому, что 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-000401 на самом деле является «ERROR». Поэтому не имеет смысла быть видимым только с уровнем DEBUG. Сначала я должен убедиться, что вы правильно установили регистрацию в своей AS. Например, с WildFly вам нужно отдельно установить уровень для Weld и для самой консоли WildFly. – Siliarus
@Siliarus Я не понимаю, что вы имеете в виду. Если я установил регистрацию в целом на ERROR, я получаю только строку с WELD-000401 и NO stacktrace. Если я установил уровень ведения журнала в целом на DEBUG, я также получаю стек. Это означает, что Weld эффективно скрывает исключение в производственной среде, где уровень журнала не будет DEBUG. Как я должен знать, какова фактическая ошибка, если Weld только регистрирует ее на уровне DEBUG? –