在PerfView中没有来自自定义.Net 4.5 EventSource ETW提供程序的事件

时间:2013-10-30 10:50:11

标签: .net asp.net-web-api .net-4.5 etw perfview

我在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文件中没有任何事件! “事件”部分甚至不包含我的提供者的名称。

我错过了什么?

更新:我找到了原因,请参阅下面的答案。

1 个答案:

答案 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的方法不应该包含非字符串的参数。