Схема 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 для запуска службы событий трассировки, и перед выполнением этой команды я также настроил SemanticLogging-svc.xml на

<eventSource name="MyCompany" level="LogAlways"/>

И затем я начинаю вызывать метод Test(). Впервые flatFileSink запишет правильный уровень события как предупреждение. Однако после того, как я изменил уровень метода Test() в атрибуте на Critical и вызвал метод Test(), flatFileSink по-прежнему будет записывать уровень как Warning. Это было совершенно неправильно! Я знаю, что это была схема EventEntry, которая является параметром метода OnNext. Но если я использую прослушиватель в процессе, уровень может быть обновлен до критического, что правильно.

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

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

Итак, может ли кто-нибудь помочь мне?


person capcom923    schedule 12.08.2015    source источник


Ответы (2)


Проблема связана с тем, что внепроцессный регистратор кэширует манифесты для источников событий: .cs" rel="nofollow">TraceEventManifestsCache.

Этот кеш записывает XML-файл манифеста во временный каталог, сгенерированный по пути:

Path.Combine(Path.GetTempPath(), "7D2611AE-6432-4639-8B91-3E46EB56CADF");

Значение Path.GetTempPath() зависит от пользователя, от имени которого работает служба, а также от версии Windows, в которой вы работаете. В этом временном каталоге вы можете найти свой кешированный манифест.

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

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

person Paul Turner    schedule 28.01.2016
comment
@ user853509, я думаю, это может быть хорошим вариантом для достижения того, что вы ищете. Что касается кешированного манифеста: удаление, которое предлагает Tragedian, должно работать, и если вам действительно нужно добиться обновления манифеста, вы можете разветвить проект в Github и добавьте эту функцию или даже предложите поднять новую проблему. - person mekoda; 17.02.2016
comment
Спасибо! Это лучшая практика! Вы нам очень помогаете! - person capcom923; 27.04.2016
comment
Я думаю, что MS следует рассмотреть возможность переключения этого флага кеша. Новичок будет долго мучиться этим кешем. Поскольку нет документа, объясняющего эту функцию. - person capcom923; 27.04.2016

Теоретически обновление свойства Version атрибута Event должно помочь. Подчеркните следует.

Это не всегда работает, схема вашего EventSource хранится в секретном волшебном недокументированном месте, которое каким-то образом обновляется в какой-то момент, если etw похоже на то. Перезагрузка даже не помогает.

person ML64    schedule 05.09.2015
comment
Спасибо за ваш комментарий. Я думаю, что очень сложно поддерживать EventSource из-за этой функции ETW. Обновление схемы источника событий должно быть частым случаем при разработке или на этапе выпуска. Однако, если нам нужно обновить версию или изменить имя источника события, когда мы изменим какую-либо схему события, мы сойдем с ума, поскольку нам также придется каждый раз обновлять XML-конфигурацию службы семантического ведения журналов. - person capcom923; 19.11.2015