Как мне справиться со сбоями регистратора?


12

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

Я всегда беспокоился о том, что обработка исключений в логгере допускает тихий сбой. То есть, если журнал не записан для данного исключения (из-за ошибки в регистраторе), как мне его обработать и (каким-то образом) зарегистрировать исключение в самом регистраторе ?

Допустим, функция WriteLog генерирует исключение. Должен ли я пытаться вызывать функцию несколько раз или до тех пор, пока не сработает исключение? Должен ли я попытаться записать выброшенное исключение с помощью регистратора (что, скорее всего, приведет к исключениям полностью ...)? Мне повезло, что я не столкнулся с такой ситуацией, за исключением случаев, когда мы впервые внедрили собственный регистратор. С другой стороны, на данный момент у меня нет возможности узнать, не удалось ли регистратору регистрировать исключения приложения (из-за его собственных исключений).

Я попытался выполнить поиск в Интернете и на некоторых сайтах SE, но до сих пор это было бесплодно, поскольку все сообщения касаются ошибок в регистраторе (но не потенциальных исключений и способов их регистрации) или исключений вне регистратора.



5
Зарегистрируйте, stderrчто ваш выходной носитель вышел из строя или произошло «невозможное».
Довал

1
Отправьте разработчикам электронное письмо или просто отобразите ошибку с адресом электронной почты и позвольте пользователю скопировать и вставить ошибку.
Хлоя

Ответы:


17

Когда вы сталкиваетесь с исключениями внутри самого регистратора, вы не должны использовать регистратор для регистрации своих собственных исключений. Причина в том, что:

  • Вы можете застрять в бесконечном цикле. Представьте, что в вашем логгере есть условная ветвь, которая не была протестирована (и генерирует исключение). Представьте, что как только условие выполнено, любое другое зарегистрированное исключение обрабатывается той же ветвью. Это означает, что с момента запуска ветки вы находитесь в бесконечном цикле.

  • Вы можете застрять во временном цикле, генерирующем тысячи исключений в секунду. Представьте, что вы сообщаете об исключениях на удаленный сервер. Проблема с сервером вызывает другое исключение, которое вызывает другое и т. Д., Пока соединение не вернется.

Вместо этого вам следует вернуться к более безопасному способу регистрации исключений. Например, если ваш регистратор отправляет исключения на удаленный сервер, отправьте исключения внутри регистратора syslog. Если ваш регистратор записывает исключения в Windows Events, и это действие не выполняется, сохраните исключение ошибки в простом текстовом файле.

Как только вы это сделаете, следующий вопрос - как вы узнаете, что произошли эти исключения: если у вас есть десятки приложений, работающих на тысячах серверов, вы не сможете регулярно использовать SSH для каждого из них, чтобы проверить, регистрировали ли они что-то локально ,

Одним из способов является создание задания cron, которое проверяет эти «исключительные журналы» и помещает их в место, где хранятся другие исключения (в конце концов, используя ваш регистратор, но остерегайтесь бесконечных или временных циклов!).


Я столкнулся с той же самой проблемой с моим регистратором исключений, который пошел к электронной почте. Если ему не удалось подключиться к серверу, он попал в ужасный бесконечный цикл. Поэтому вместо этого я установил флажок для перенаправления в журнал событий и предотвращения отправки новых электронных писем, пока не будет установлено новое соединение.
mgw854 12.12.14

Я думаю, что мы попытаемся реализовать запасной вариант, как вы предлагаете Предложение Джона Рейнора о прекращении работы приложения (в критической ситуации с журналированием) также может быть рассмотрено нами, которое мы не рассмотрели.
Заирья

Что делать, если в результате тайм-ауты отправляются в системный журнал или ошибки ввода-вывода записываются в файл? Вы все еще можете усугубить проблему, если сбои происходят из-за перегруженной сети или из-за недостатка места на диске. Это не совсем целостное решение; Вы должны учитывать возможность того, что не может быть никакого безопасного способа регистрации ошибок. Это не так опасно, чтобы войти в свой собственный регистратор, если вы
включите

11

Если ведение журнала имеет решающее значение для вашего приложения, то следует остановить приложение, если ведение журнала не удается.

Если не критично, то, будучи несколько защитным, можно иметь дополнительный компонент для обработки ошибок регистрации, который регистрирует / оповещает вторичный источник. Но даже это не является надежным доказательством, и вам придется подумать о том, что произойдет, если вторичный регистратор выйдет из строя во время мониторинга основного регистратора.

Хорошей стратегией является запись в локальный файл, а в случае сбоя - регистрация этого сбоя в журнале событий, генерация оповещения по электронной почте, сохранение в базе данных и т. Д. При наличии доступных сред ведения журналов это должно быть безошибочным, если машина не запускается. Недостаточно места на диске или другое редкое состояние.

В идеале лучше не работать тихо, так как это сделает приложение менее сложным.

Что еще более важно, для обработки ошибок журналирования необходимо следить за журналами от третьей стороны. Со временем вы сможете различить, сколько событий регистрирует здоровое приложение. Если он начинает регистрировать события с низким уровнем или без событий, то с помощью мониторинга вы можете увидеть возникшую проблему и потенциально предупредить об этом через сторонний механизм.


1
+1 за различие между критическими и некритическими журналами, а также за важность количества журналов за промежуток времени. Я разочарован тем, что я не думал об этих двух аспектах, в то время как я использовал резервную регистрацию в течение многих лет.
Арсений Мурзенко
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.