Схема EventEntry не была обновлена с использованием внепроцессного семантического ведения журнала
Я пишу пользовательский класс EventSource и добавляю метод для журнала, как показано ниже:
[EventSource(Name = "MyCompany")]
public class MyCompanyEventSource : EventSource
{
[Event(6, Message = "test.", Keywords = Keywords.Perf,
Level = EventLevel.Warning)]
public void Test()
{
this.WriteEvent(6);
}
}
И я использовал SemanticLogging-svc.exe -c, чтобы запустить службу событий трассировки, и перед выполнением этого cmd я также настроил SemanticLogging-svc.xml для
<eventSource name="MyCompany" level="LogAlways"/>
И тогда я начинаю вызывать метод Test(). Впервые flatFileSink запишет правильный уровень события как Предупреждение. Однако после того как я изменил уровень метода Test() в атрибуте на Critical и вызвал метод Test(), flatFileSink все равно будет записывать уровень как Warning. Это было совершенно неправильно! Я знаю, что это была схема EventEntry, которая является параметром методов OnNext. Но если я использую внутрипроцессный слушатель, уровень может быть обновлен до критического, что является правильным.
Итак, почему уровень остается прежним, если я использую внепроцессный? Это что-то не так с ETW? Похоже, в машине есть какой-то кеш. И этот кэш не может быть очищен независимо от остановки и удаления сеанса трассировки событий в системном мониторе, а также для перезагрузки компьютера. Я действительно хочу очистить этот кеш, но я не знал, как это сделать.
И я знаю, что если я изменил версию в атрибуте события или изменил имя источника событий на другое, уровень будет обновлен для внепроцессного. Но я думаю, что это не очень хороший способ, так как мы можем забыть изменить версию.
Итак, кто-то может мне помочь?
2 ответа
Проблема связана с кэшированием вне процесса Logger манифестов для источников событий: TraceEventManifestsCache.
Этот кэш записывает XML-манифест во временный каталог, созданный с путем:
Path.Combine(Path.GetTempPath(), "7D2611AE-6432-4639-8B91-3E46EB56CADF");
Значение Path.GetTempPath()
зависит от пользователя, с которым запущена служба, а также от версии Windows, на которой вы работаете. В этом временном каталоге вы можете найти ваш кэшированный манифест.
Служба не дает понять, при каких условиях она очищает кэшированный манифест, однако не всегда срабатывает, когда вы ожидаете.
Если вы удалите кэшированный файл для своего манифеста, это заставит провайдера получить новую версию манифеста. Вам следует перезапустить сервис, чтобы он сразу же захватил манифест.
Теоретически, обновление Version
собственность Event
Атрибут должен сделать свое дело. Акцент на следует.
Это не всегда работает, схема вашего EventSource
хранится в секретном незарегистрированном месте магии, которое в какой-то момент обновляется, если вам так нравится. Перезагрузка даже не помогает.