Наш микросервис на основе Spring иногда не может подключиться к своей службе обработки событий в течение нескольких минут. Это нормально с точки зрения приложения, так как у нас есть несколько повторных попыток и запасных вариантов, которые позаботятся об этом. Каждая неудачная попытка подключения приводит к записи в журнал ERROR класса org.springframework.jms.listener.DefaultMessageListenerContainer. Можно ли настроить Spring таким образом, чтобы это сообщение журнала записывалось с более низким уровнем журнала, например WARN?
Ваши варианты, которые я вижу, - это жить с этим, подавить регистрацию ошибок из этого класса или разветвить библиотеку и внести изменения. Я бы НЕ рекомендовал последнее. Нет ли в библиотеке хуков обработки ошибок, которые позволили бы избежать логирования?
@Taylor Я не видел никаких хуков, которые позволили бы перехватывать и подавлять стандартную обработку ошибок. Библиотека генерирует исключения, на которые мы реагируем повторными попытками и откатами. Это на самом деле достаточно хорошо для нас. Однако перед тем, как выдать эти исключения, библиотека применяет свое стандартное поведение и регистрирует временный сбой подключения как ОШИБКУ.
Как упомянул @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, которая позволила бы переклассифицировать уровни журнала. Без этого мы будем искать способ настроить наши оповещения, чтобы игнорировать определенную часть этих не очень важных журналов.
Как упоминалось в некоторых других комментариях, некоторые компоненты Spring позволяют устанавливать флаг конфигурации, чтобы немного изменить вывод журнала (т.е. записывать что-то в WARN, используя if/else где-то там). Возможно, вы могли бы открыть проблему GitHub в соответствующем Spring Repo или даже предоставить исправление самостоятельно, если считаете, что оно оправдано для более широкой аудитории.
@Florian Еще одна вещь, так как у меня была похожая проблема некоторое время назад. Если вы готовы инициализировать bean-компоненты самостоятельно, вы можете реализовать проверку работоспособности для внешней службы и приостановить инициализацию компонентов JMS до тех пор, пока не будете уверены, что внешний компонент должен быть доступен. Это сведет к минимуму количество ложных срабатываний во время запуска, хотя и за счет небольшого увеличения времени запуска (для повторных попыток/отсрочки).
Это невозможно, потому что уровень, на котором регистрируется сообщение, определяется фактическим вызовом функции. .
Итак, если у Spring есть что-то вроде:
public void connect() {
try(establishConnection()) {
// ...
} catch (Exception e) {
log.error("Failed to establish connection");
}
Вы заметите, что ведение журнала всегда выполняется на уровне ошибок, так как это то, что вызывается.
Что вы можете сделать, так это установить уровень журнала класса на OFF :
# application.yml
Лог.уровень: org.springframework.jms.listener.DefaultMessageListenerContainer: ВЫКЛ.
Нет, это невозможно