2

我在我的 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):

解析规范 *WebApi 启用提供程序:*WebApi 级别:关键关键字:0x0 选项:无 值:Guid:fc7bbb67-1b01-557b-5e0e-c1c4e40b6a24

然后我使用过滤器“*WebApi”运行“收集”,在我的应用程序中执行一些操作并停止它。

但是在 etl 文件中我的提供商没有任何事件!“事件”部分甚至不包含我的提供者的名称。

我错过了什么?

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

4

1 回答 1

3

事实证明,事件丢失的原因非常微妙。为简单起见,我没有提供所有代码,只是我认为重要的部分 - 我正在调用的方法EventSource.WriteEvent

有趣的是,如果 EventSource 实现类包含使用相同 id 调用的任何其他方法,EventSource.WriteEvent那么您将看不到来自该 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不应该有不是字符串的参数。

于 2013-10-31T10:53:47.473 回答