我在ASP.NET WebApi应用程序中创建了一个EventSource(WebApiEventSource)(就像ITraceWriter实现一样):
[EventSource(Name = "WebApi")]
public class WebApiEventSource : EventSource
{
public static readonly WebApiEventSource Log = new WebApiEventSource();
[Event(1)]
public void Event(string url, string message)
{
WriteEvent(1, url, message);
}
}
我检查过EventSource的方法在运行时被调用而没有错误。
然后我运行PerfView并在其日志中检查它可以看到我的提供者(EventSource):
解析Spec * WebApi 启用提供程序:* WebApi级别:严重关键字:0x0选项:无值:Guid:fc7bbb67-1b01-557b-5e0e-c1c4e40b6a24
然后我使用过滤器“* WebApi”运行'collect',在我的应用程序中执行一些操作并停止它。
但是我的提供者在etl文件中没有任何事件! “事件”部分甚至不包含我的提供者的名称。
我错过了什么?
更新:我找到了原因,请参阅下面的答案。
答案 0 :(得分:2)
事实证明,事件缺失的原因非常微妙。
为了简单起见,我没有提供我的所有代码,只是我认为重要的部分 - 我正在调用EventSource.WriteEvent
的方法。
有趣的是,如果EventSource实现类包含 ANY 其他方法,其中使用相同的ID调用EventSource.WriteEvent
,那么您将看不到 ANY 来自此EventSource的事件。这简直令人难以置信,但确实如此。
所以我的类还有一个使用WriteEvent调用的方法,我没有使用它:
[EventSource(Name = "WebApi")]
public class WebApiEventSource : EventSource
{
public static readonly WebApiEventSource Log = new WebApiEventSource();
public void Event(string url, string message)
{
WriteEvent(1, url, message);
}
public void Event2(string url, string message)
{
WriteEvent(1, url, message);
}
}
之后我删除了我的附加方法(Event2)我确实在PerfView日志中看到了我的事件!
注意:应用EventAttribute确实是完全可选的。
我发现的另一个原因是调用WriteEvent
的方法不应该包含非字符串的参数。