Операторы журнала работают в блоке try, но не в блоке catch Java

#java #logging #log4j

Вопрос:

У меня есть следующий код:

 try {
        Log.debug("TEST 1");
        InputStream input = loadTemplate(template);
        String ofmt = template.getOutputFormat() != null ? template.getOutputFormat().trim().toLowerCase() : "";
        if ("prn".equals(ofmt)) {
            report = createPrinterProcess(template, input);
        } else if (IsImageFormat(ofmt)) {
            report = createImageProcess(ofmt, template, input);
        } else {
            report = createProcess(ofmt, input, new ByteArrayOutputStream());
        }

        return report;
    } catch (Exception e) {
        ControllerBase.getRepository().saveError(template, new ServiceError(e));
        Log.warn(String.format("Generate(template, %1$s)", template.getGuid()), e);
        return null;
    }
 

Оператор журнала в try получает попадание и отображается в файле журнала, но операторы журнала в блоке catch получают попадание, но не отображаются в файле журнала. Они оба используют один и тот же регистратор. Есть какие-нибудь идеи относительно того, что происходит? Я просто не понимаю, почему журналы будут работать в попытке, но не в улове. Я перепробовал все разные уровни ведения журнала, все работают в попытке, ни один не работает в улове.

Редактировать

Моя конфигурация журнала, как консоль, так и файл журнала настроены одинаково: введите описание изображения здесь

и вот как выглядит saveError, все, что он делает, — это сохраняет ошибку в файл .error, и это не нарушает метод (я прошел через него).: введите описание изображения здесь

Комментарии:

1.Что же saveError делать? Что произойдет, если вы поставите Log.warn перед этой первой строкой? Я подозреваю, что saveError либо каким-то образом повторно создает исключение, либо создает собственное исключение.

2. Возможно, ваш ControllerBase.getRepository().saveError(template, new ServiceError(e)); вызов зависает, и поэтому выполнение не возвращается к более поздним строкам кода?

3. @JoachimSauer saveError в основном сохраняет исключение в файле ошибок. Я попытался изменить журнал, чтобы он был перед этой строкой, но все равно не повезло 🙁 что еще более странно, операторы журнала отображаются в консоли, а не в файле журнала. Все остальные инструкции журнала отображаются в обоих!

4. @zr0gravity7Iive прошел через код, и кажется, что эти строки выполняются, в saveError не происходит ничего неожиданного 🙁

5. Вероятно, это связано с уровнем журнала. Поскольку ваш журнал отладки показывает, что ваш уровень журнала, по крайней мере, ОТЛАДОЧНЫЙ, поэтому журналы предупреждений отображаться не будут. Если это так, вы должны установить уровень журнала для ПРЕДУПРЕЖДЕНИЯ.