Я использую приложения .NET 4.5 для генерации событий ETW с использованием класса EventSource
. Цель состоит в том, чтобы зафиксировать некоторые из этих событий (события уровня ошибки) для регистрации ошибок.
После некоторого чтения и тестирования я обеспокоен надежностью такого подхода к регистрации ошибок, особенно в отношении возможности сброса или отсутствия событий. Если мой журнал ошибок не работает, мне нужно, чтобы приложение закрылось (в моем случае для него небезопасно работать с неподтвержденными ошибками). При использовании ETW и EventSource
, как я могу быть уверенным, что мои ошибки правильно записываются?
Очевидно, что часть ответа будет зависеть от того, что слушает события. В моем случае я планирую использовать "Блок приложений семантического журнала" из последней библиотеки MS Enterprise.
Вот один из источников, где Microsoft говорит о возможных причинах пропущенных событий: О трассировке событий
Там перечислены эти возможные причины пропущенных событий
Общий размер события больше 64K. Это включает в себя заголовок ETW, а также данные или полезную нагрузку. Пользователь не имеет контроля над этими отсутствующими событиями, так как размер события сконфигурирован приложением.
Размер буфера ETW меньше, чем общий размер события. Пользователь не имеет контроля над этими отсутствующими событиями, так как размер события настраивается приложением, регистрирующим события.
Для ведения журнала в реальном времени потребитель в режиме реального времени не потребляет события достаточно быстро или вообще не присутствует, а затем заполняется файл резервной копии. Это может произойти, если служба журнала событий остановлена и запущена при регистрации событий. Пользователь не имеет контроля над этими отсутствующими событиями.
При входе в файл диск слишком медленный, чтобы не отставать от скорости ведения журнала.
Чтобы убедиться, что эти проблемы были каким-то образом смягчены с помощью класса EventSource (например, он каким-то образом обрезает большие полезные нагрузки), я провел некоторое тестирование. Я пытался записывать длинные строки, и мне не удалось от 30 000 до 35 000 символов (прямо в соответствии с максимальной нагрузкой на 64 КБ). Он просто ничего не делает из того, что я могу сказать для слишком больших строк, никаких событий в моем блоке Block Application Application Semantic Logging. События до и после были написаны, как обычно.
Итак, в любое время, когда у меня есть строка в моей полезной нагрузке, я должен передать ее через какой-нибудь truncator? Нужно ли мне вручную избегать генерации событий "слишком быстро" (и как это возможно)?
Microsoft Patterns and Practices должны привести нас к хорошим... образцам и практикам... поэтому, возможно, я просто что-то пропустил здесь.
Update:
По-видимому, в приложении-потребителе есть какое-то уведомление о состоянии "События слишком быстро". Я получил это сегодня в первый раз:
Уровень: предупреждение, сообщение: некоторые события будут потеряны из-за переполнения буфера или задержки синхронизации схемы в сеансе трассировки: Microsoft-SemanticLogging-Etw-svcRuntime
И затем, закрывая сеанс:
Уровень: предупреждение, сообщение: потеря 1 события была обнаружена в сеансе трассировки "Microsoft-SemanticLogging-Etw-svcRuntime".
Update2:
Руководство разработчика корпоративных библиотек описывает поведение, о котором я только что упомянул.
Вы должны отслеживать сообщения журнала, сгенерированные блоком приложений семантического журнала, для любой индикации, что буферы переполнены и что вы потеряли сообщения. Например, сообщения журнала с идентификаторами событий 900 и 901 показывают, что внутренние буферы стоков переполнены; в сценарии вне процесса, идентификаторы 806 и 807 событий показывают, что буферы ETW переполнены. Вы можете изменить параметры настройки буферизации для приемников, чтобы уменьшить вероятность переполнения буферов типичными рабочими нагрузками.
Остается мой вопрос, могу ли я использовать семантическую регистрацию, пока мое приложение не запускается, если ошибки отбрасываются? Обычные события трассировки можно отбросить...
Моя текущая мысль состоит в том, чтобы записывать критические ошибки с отдельным классом с использованием старомодных методов ведения журнала и сохранять менее критические ошибки (а также события типа отладки), проходящие через конвейер ETW. Это было бы не так уж плохо... Я мог бы опубликовать это как решение, если не могу найти лучшего предложения.
Обновление 3:
Предупреждение "отсутствующих событий", которое я получил, не имеет ничего общего с переполнениями буфера, получается, что это сообщение вы получаете, если вы передаете null string
в качестве значения полезной нагрузки.