В некоторых приложениях нашей компании мы используем собственный регистратор. Он достаточно надежный, хотя в будущем мы можем заменить его чем-то вроде NLog. Одна из задач регистратора - регистрировать любые исключения, встречающиеся в приложении.
Я всегда беспокоился о том, что обработка исключений в логгере допускает тихий сбой. То есть, если журнал не записан для данного исключения (из-за ошибки в регистраторе), как мне его обработать и (каким-то образом) зарегистрировать исключение в самом регистраторе ?
Допустим, функция WriteLog генерирует исключение. Должен ли я пытаться вызывать функцию несколько раз или до тех пор, пока не сработает исключение? Должен ли я попытаться записать выброшенное исключение с помощью регистратора (что, скорее всего, приведет к исключениям полностью ...)? Мне повезло, что я не столкнулся с такой ситуацией, за исключением случаев, когда мы впервые внедрили собственный регистратор. С другой стороны, на данный момент у меня нет возможности узнать, не удалось ли регистратору регистрировать исключения приложения (из-за его собственных исключений).
Я попытался выполнить поиск в Интернете и на некоторых сайтах SE, но до сих пор это было бесплодно, поскольку все сообщения касаются ошибок в регистраторе (но не потенциальных исключений и способов их регистрации) или исключений вне регистратора.
stderr
что ваш выходной носитель вышел из строя или произошло «невозможное».Ответы:
Когда вы сталкиваетесь с исключениями внутри самого регистратора, вы не должны использовать регистратор для регистрации своих собственных исключений. Причина в том, что:
Вы можете застрять в бесконечном цикле. Представьте, что в вашем логгере есть условная ветвь, которая не была протестирована (и генерирует исключение). Представьте, что как только условие выполнено, любое другое зарегистрированное исключение обрабатывается той же ветвью. Это означает, что с момента запуска ветки вы находитесь в бесконечном цикле.
Вы можете застрять во временном цикле, генерирующем тысячи исключений в секунду. Представьте, что вы сообщаете об исключениях на удаленный сервер. Проблема с сервером вызывает другое исключение, которое вызывает другое и т. Д., Пока соединение не вернется.
Вместо этого вам следует вернуться к более безопасному способу регистрации исключений. Например, если ваш регистратор отправляет исключения на удаленный сервер, отправьте исключения внутри регистратора
syslog
. Если ваш регистратор записывает исключения в Windows Events, и это действие не выполняется, сохраните исключение ошибки в простом текстовом файле.Как только вы это сделаете, следующий вопрос - как вы узнаете, что произошли эти исключения: если у вас есть десятки приложений, работающих на тысячах серверов, вы не сможете регулярно использовать SSH для каждого из них, чтобы проверить, регистрировали ли они что-то локально ,
Одним из способов является создание задания cron, которое проверяет эти «исключительные журналы» и помещает их в место, где хранятся другие исключения (в конце концов, используя ваш регистратор, но остерегайтесь бесконечных или временных циклов!).
источник
Если ведение журнала имеет решающее значение для вашего приложения, то следует остановить приложение, если ведение журнала не удается.
Если не критично, то, будучи несколько защитным, можно иметь дополнительный компонент для обработки ошибок регистрации, который регистрирует / оповещает вторичный источник. Но даже это не является надежным доказательством, и вам придется подумать о том, что произойдет, если вторичный регистратор выйдет из строя во время мониторинга основного регистратора.
Хорошей стратегией является запись в локальный файл, а в случае сбоя - регистрация этого сбоя в журнале событий, генерация оповещения по электронной почте, сохранение в базе данных и т. Д. При наличии доступных сред ведения журналов это должно быть безошибочным, если машина не запускается. Недостаточно места на диске или другое редкое состояние.
В идеале лучше не работать тихо, так как это сделает приложение менее сложным.
Что еще более важно, для обработки ошибок журналирования необходимо следить за журналами от третьей стороны. Со временем вы сможете различить, сколько событий регистрирует здоровое приложение. Если он начинает регистрировать события с низким уровнем или без событий, то с помощью мониторинга вы можете увидеть возникшую проблему и потенциально предупредить об этом через сторонний механизм.
источник