2013-10-30 19 views
2

自定義.NET 4.5的EventSource ETW提供商的事件我在ASP.NET的WebAPI應用程序創建一個EventSource的(WebApiEventSource)(以作爲ITraceWriter的實現):沒有從PerfView

[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

然後我運行'collect'過濾器「* WebApi」,在我的應用程序中執行一些操作並停止它。

但是在etl文件中沒有任何來自我的提供者的事件! 「事件」部分甚至不包含我的提供商的名稱。

我錯過了什麼?

已更新:我找到了原因,請參閱下面的答案。

回答

2

事實證明,事件缺失的原因非常微妙。 爲了簡單起見,我沒有提供我所有的代碼,只是我認爲很重要的一部分 - 我打電話給EventSource.WriteEvent的方法。

有趣的是,如果一個EventSource的的實現類包含任何其他方法,其中EventSource.WriteEvent被稱爲具有相同ID,那麼你將不會看到來自該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); 
    } 
} 

之後,我打消了我額外的方法(事件2)我沒有看到我在PerfView記錄事件!

注意:應用EventAttribute確實是完全可選的。

我發現的另一個原因是調用WriteEvent的方法不應該有不是字符串的參數。

+0

如果我的理解正確,你應該讓Event2使用id = 2來表示WriteEvent,例如:WriteEvent(2,url,message)。這是因爲id是唯一的64位標識符,它與WebApi(您的事件源名稱)下的事件2不同。我可能是錯的,如果有的話,請糾正我。 – LosManos

+0

請注意,如果您使用NuGet中的'Microsoft.Diagnostics.Tracing.EventSource',則還可以包含Microsoft EventRegister工具,該工具添加了一個生成目標,該目標檢查這些陷阱中的一些(而不是全部)陷阱。 – Benjol