Можно ли создать подкласс EventSource в ETW?

Я хотел бы иметь возможность объявить EventSource, который имеет как минимум несколько методов, которые по умолчанию предоставляют обычные средства ведения журнала.

e.g.

  • Информация()
  • Предупреждать()
  • Ошибка()

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

Я делаю это неправильно? Если да, то как я могу достичь вышеизложенного? См. пример кода:

    public class ETWBase : EventSource
    {
        [Event(1, Channel = EventChannel.Admin, Message = "Info Message: {0}")]
        public void Info(string message) { this.WriteEvent(1); }

        [Event(2, Channel = EventChannel.Debug, Message = "Debug Message: {0}")]
        public void Trace(string message) { this.WriteEvent(2); }

    }

    [EventSource(Name = "ABC-MyEtwServiceEventSource")]
    public sealed class MyEtwServiceEventSource : ETWBase
    {
        public static MyEtwServiceEventSource Log = new MyEtwServiceEventSource();

        [Event(3, Channel = EventChannel.Debug, Message = "My specific Message: {0}")]
        public void Trace(string message) { this.WriteEvent(3); }       
    }

Я использую последнюю и лучшую версию Microsoft.Diagnostics.Tracing (pre), которая, как я понимаю, поддерживает каналы, в отличие от SLAB из Enterprise Library.


person jaffa    schedule 25.09.2013    source источник
comment
Microsoft.Diagnostics.Tracing (pre) ожидает, что класс будет запечатан. Класс, наследующий EventSource, должен быть запечатан, вы не сможете сгенерировать манифест, если не пометите его как запечатанный. Сомневаюсь, что это сработает.   -  person KRP    schedule 25.09.2013
comment
Как я могу использовать общие методы для нескольких источников событий в масштабной системе?   -  person jaffa    schedule 25.09.2013
comment
Я не совсем уверен в этом, я думаю, что мы не можем этого сделать.   -  person KRP    schedule 25.09.2013
comment
стабильная версия теперь должна разрешать то, что вы хотите, согласно блогу: blogs.msdn.com/b/dotnet/archive/2014/01/30/ Типы EventSource теперь могут реализовывать интерфейсы и концепцию служебного источника событий. type (определяемый как абстрактный класс, производный от EventSource) введен для поддержки совместного использования кода между несколькими типами источников событий в проекте (например, для оптимизированных перегрузок WriteEvent()).   -  person magicandre1981    schedule 18.04.2014
comment
Хорошо, спасибо за это. Я узнал о разработке, но к тому времени я уже реализовал свою библиотеку ETW в виде пакета NuGet, содержащего предварительно написанный исходный код в виде частичного класса, к которому затем можно было добавить.   -  person jaffa    schedule 22.04.2014
comment
Прошло два года — ситуация все та же: некоторые события в базовом классе мы не можем объявлять как события, а не только как «вспомогательные» методы.   -  person cassandrad    schedule 08.06.2016


Ответы (1)


ETWBase должен быть абстрактным и не должен иметь методов, декорированных EventAttribute.

Дополнительную информацию можно найти в файле документации _EventSourceUsersGuide.docx, который добавляется в ваш проект, если вы ссылаетесь на Источник события или Источник события Образцы пакетов nuget.

person Sergey Baranchenkov    schedule 15.04.2015