Могу ли я изменить уровень сообщения, регистрируемого Spring?

Наш микросервис на основе Spring иногда не может подключиться к своей службе обработки событий в течение нескольких минут. Это нормально с точки зрения приложения, так как у нас есть несколько повторных попыток и запасных вариантов, которые позаботятся об этом. Каждая неудачная попытка подключения приводит к записи в журнал ERROR класса org.springframework.jms.listener.DefaultMessageListenerContainer. Можно ли настроить Spring таким образом, чтобы это сообщение журнала записывалось с более низким уровнем журнала, например WARN?

Нет, это невозможно

Jens 10.01.2023 15:44

Ваши варианты, которые я вижу, - это жить с этим, подавить регистрацию ошибок из этого класса или разветвить библиотеку и внести изменения. Я бы НЕ рекомендовал последнее. Нет ли в библиотеке хуков обработки ошибок, которые позволили бы избежать логирования?

Taylor 10.01.2023 15:51

@Taylor Я не видел никаких хуков, которые позволили бы перехватывать и подавлять стандартную обработку ошибок. Библиотека генерирует исключения, на которые мы реагируем повторными попытками и откатами. Это на самом деле достаточно хорошо для нас. Однако перед тем, как выдать эти исключения, библиотека применяет свое стандартное поведение и регистрирует временный сбой подключения как ОШИБКУ.

Florian 11.01.2023 09:20
Как сделать движок для футбольного матча? (простой вариант)
Как сделать движок для футбольного матча? (простой вариант)
Футбол. Для многих людей, живущих на земле, эта игра - больше, чем просто спорт. И эти люди всегда мечтают стать футболистом или менеджером. Но, к...
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
Лучшая компания по разработке спортивных приложений
Лучшая компания по разработке спортивных приложений
Ищете лучшую компанию по разработке спортивных приложений? Этот список, несомненно, облегчит вашу работу!
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Если вы являетесь веб-разработчиком или тестировщиком, вы можете быть знакомы с Selenium, популярным инструментом для автоматизации работы...
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Что такое Java 8 Streams API? Java 8 Stream API
Деревья поиска (Алгоритм4 Заметки к учебнику)
Деревья поиска (Алгоритм4 Заметки к учебнику)
(1) Двоичные деревья поиска: среднее lgN, наихудшее N для вставки и поиска.
0
3
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как упомянул @Jens, это невозможно, поскольку уровень, на котором регистрируется сообщение, определяется фактическим вызовом функции.

Итак, если Spring (или любая другая библиотека или даже ваш собственный код) имеет что-то вроде:

public void connect() {
    try(establishConnection()) {
        // ...
    } catch (Exception e) {
        log.error("Failed to establish connection");
    }

Вы заметите, что ведение журнала всегда выполняется на уровне error, поскольку именно он вызывается.

Единственный выход, который у вас есть в этом случае, — установить уровень ведения журнала класса на OFF, если ваша данная реализация ведения журнала поддерживает его (по умолчанию Logback поддерживает). Например:

# application.yml
logging.level:
  org.springframework.jms.listener.DefaultMessageListenerContainer: OFF

Однако на самом деле нет причин делать это, если только вы не будете полностью завалены этими сообщениями журнала (и даже в этом случае просто отфильтруйте их на своей панели инструментов). Журналы ошибок существуют по какой-то причине.

В качестве альтернативы, я полагаю, вы могли бы также использовать некоторые хакерские трюки, используя AspectJ, чтобы изменить уровень, на котором что-то регистрируется, если вам действительно нужно, но я сомневаюсь, что это применимо в этом случае.

Наконец, вы можете разветвить библиотеку и связать свои собственные файлы Jar со своим приложением. Но я сомневаюсь, что это бремя обслуживания стоит того в этом случае.

Спасибо за хорошие предложения. 👍 Мы точно не пойдем по хакерскому пути там, оно того не стоит. Мы используем такие оповещения, как «> 20 ОШИБОК за последние 24 часа», для выявления проблем в наших развертываниях. Эти журналы вызывают эти предупреждения слишком часто, без необходимости. Я надеялся на некоторую магию конфигурации Spring, которая позволила бы переклассифицировать уровни журнала. Без этого мы будем искать способ настроить наши оповещения, чтобы игнорировать определенную часть этих не очень важных журналов.

Florian 11.01.2023 09:23

Как упоминалось в некоторых других комментариях, некоторые компоненты Spring позволяют устанавливать флаг конфигурации, чтобы немного изменить вывод журнала (т.е. записывать что-то в WARN, используя if/else где-то там). Возможно, вы могли бы открыть проблему GitHub в соответствующем Spring Repo или даже предоставить исправление самостоятельно, если считаете, что оно оправдано для более широкой аудитории.

filpa 11.01.2023 12:13

@Florian Еще одна вещь, так как у меня была похожая проблема некоторое время назад. Если вы готовы инициализировать bean-компоненты самостоятельно, вы можете реализовать проверку работоспособности для внешней службы и приостановить инициализацию компонентов JMS до тех пор, пока не будете уверены, что внешний компонент должен быть доступен. Это сведет к минимуму количество ложных срабатываний во время запуска, хотя и за счет небольшого увеличения времени запуска (для повторных попыток/отсрочки).

filpa 11.01.2023 13:39

Это невозможно, потому что уровень, на котором регистрируется сообщение, определяется фактическим вызовом функции. .

Итак, если у Spring есть что-то вроде:

public void connect() {
try(establishConnection()) {
    // ...
} catch (Exception e) {
    log.error("Failed to establish connection");
}

Вы заметите, что ведение журнала всегда выполняется на уровне ошибок, так как это то, что вызывается.

Что вы можете сделать, так это установить уровень журнала класса на OFF :

# application.yml

Лог.уровень: org.springframework.jms.listener.DefaultMessageListenerContainer: ВЫКЛ.

Другие вопросы по теме