我有一个跨越许多项目的 C# 解决方案。我创建了一个从 Systme.Diagnostics.Tracing.EventSource 继承的跟踪类,称为 MyCustomEventSource,它处理我的大部分跟踪事件。我想为每个项目创建此类的子类,以便我可以实现与特定项目相关的事件。
我还在编写一个 ETW 消费者,我可以在其中轻松收听来自系统不同组件的事件。
但是我的消费者没有正确识别事件:当我监听 MyCustomEventSource 时,每个事件的 EventName 字段设置为方法的名称,而 FormattedMessage 设置为 Message 属性。例子:
[Event(1,
Message = "The configuration parameter \"{0}\" was loaded with a value of {1}.",
Level = EventLevel.Informational,
Task = Tasks.Configuration,
Keywords = Keywords.Diagnostics)]
public void ConfigParameterLoaded(string name, string value)
{
WriteEvent(1, name, value);
}
如果我监听 MyCustomEventSource,并且一个应用调用了 ConfigParameterLoaded,那么我会得到一个名称为 ConfigParameterLoaded 的事件,它的 FormattedMessage 是“配置参数“x”的值是 y。”
这可以。
但是,如果我在 MyCustomEventSource 的子类上创建类似的方法并从该子类触发事件,我的 EventName 将始终为“EventSourceMessage”,而 FormattedMessage 将始终为空。
我认为这可能是因为 System.Diagnostics.Tracing.EventAttribute 没有 AttributeUsage(Inherited=true)。
我的问题是:有没有办法解决这个问题,并在从子类触发事件时获取正确的信息?