Нет событий от собственного.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 не должно иметь аргументов, которые не являются строками.

Другие вопросы по тегам