Отложенное логирование

292
15 сентября 2017, 18:31

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

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

Заранее спасибо

Answer 1

Готовых обёрток нет. Реализовать можешь самостоятельно.

Для того, чтобы отловить момент возникновения ошибки, подпишись на событие FirstChanceException. Для того, чтобы твоё решение нормально работало в многопоточной среде, можешь использовать AsyncLocal в качестве хранилища. Только учитывай, что с таким подходом, тебе нужно жёстко контролировать все возникающие в приложении исключения, и ты не имеешь права их гасить и продолжать операцию в том же контексте. Чуть более гибкое решение будет заключаться в ручном вызове логирования в блоке catch. Таким образом ты сможешь залогировать и полный стек исключения, и отсечь те ошибки, которые логировать не требуется.

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

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

READ ALSO
Как хранить объекты в List<T>? С#

Как хранить объекты в List<T>? С#

У меня есть абстрактный класс Izdanie, от которого наследуются классы Kniga и JournalОт Kniga наследуется класс Uchebnik

355
Поставить условие в Repeater

Поставить условие в Repeater

ЗдравствуйтеПосле обработки данных на сервере данные выводятся в Repeater, который выглядит следующим образом:

339
Премещение кнопки при наведении мыши на кнопку

Премещение кнопки при наведении мыши на кнопку

Как можно при наведении мыши на кнопку перемещать ее (так же, только еще в обратную сторону нужно)? Этот код криво справляетсяТ

293
Привязка button к Int

Привязка button к Int

У меня есть две кнопки в DataTemplateНужно привязать их к свойству типа int так, что бы по нажатию одной кнопки переменная увеличивалась, по другой...

323