Нет событий от собственного.Net 4.5 EventSource ETW провайдера в PerfView
Я создал EventSource (WebApiEventSource) в своем приложении ASP.NET WebApi (в качестве реализации 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
Затем я запускаю команду collect с фильтром "*WebApi", выполняю некоторые действия в моем приложении и останавливаю их.
Но никаких событий от моего провайдера в файле etl нет! Раздел "События" даже не содержит названия моего провайдера.
Что я упустил?
ОБНОВЛЕНО: Я нашел причину, см. Мой ответ ниже.
1 ответ
Оказывается, причина отсутствия событий довольно тонкая. Для простоты я не предоставил весь свой код, только часть, которую я считаю важной - метод, в который я вызываю EventSource.WriteEvent
,
Интересно, что если класс реализации EventSource содержит ЛЮБОЙ другой метод, где 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
не должно иметь аргументов, которые не являются строками.