在ETW中,是否可以对EventSource进行子类化?

7
我希望能声明一个EventSource,它至少拥有几个方法,这些方法默认提供常规的日志功能。
例如:
- Info() - Warn() - Error()
此外,我希望在每个服务中定义一个特定的事件源,该事件源从提供上述功能的基类继承而来。 目前,创建清单的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),它具有通道的支持,不同于Enterprise Library中的SLAB。


1
Microsoft.Diagnostics.Tracing (预) 要求该类必须是密封的。继承 EventSource 的类需要被标记为 sealed,否则将无法生成清单。我怀疑这样是否可行。 - KRP
我该如何在广泛的系统中跨多个EventSources共享通用方法? - jaffa
我不太确定这一点,我认为我们不能这样做。 - KRP
1
稳定版本现在应该允许您想要的,根据博客:http://blogs.msdn.com/b/dotnet/archive/2014/01/30/microsoft-diagnostics-tracing-eventsource-rtms.aspx?Redirected=true,“EventSource类型现在可以实现接口”,并且“引入了一个实用事件源类型的概念(定义为从EventSource派生的抽象类),以支持在项目中跨多个事件源类型共享代码(例如,用于优化的WriteEvent()重载)。 - magicandre1981
好的,谢谢你提供这个信息。我已经知道了这个开发情况,但是那时候我已经将我的ETW库实现为一个NuGet包,其中包含预先编写的源代码作为部分类,然后可以添加到其中。 - jaffa
两年过去了,情况仍然没有改变:我们无法将基类中的某些事件声明为事件,而不仅仅是“辅助”方法。 - cassandrad
1个回答

3

ETWBase 应该是抽象的,不应该有被 EventAttribute 修饰的方法。

如果您正在引用 Event SourceEvent Source Samples nuget 包,则可以在文档文件 _EventSourceUsersGuide.docx 中找到更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接