Пользовательские источники событий, созданные с использованием базового конструктора (имя строки), не регистрируются

Я пытаюсь реализовать ETW с помощью специального класса на основе EventSource (как и предполагалось). Я прекрасно вижу журналы при использовании базы конструктор

public class TestSource : EventSource
{
    public static readonly TestSource Log = new TestSource();

    public TestSource() : base() { }

    public void LogMe(string msg)
    {
        WriteEvent(1, msg);
    }
}

но когда я переключаюсь на использование конструктора , который позволяет вам определить имя

    public TestSource() : base("TestSource") { }

Журналы больше не появляются.

У меня нет проблем в конструкторе (Я использовал этот флаг для выдачи ошибок конструкции) или при вызове для записи журнала (также использовал этот флаг). Кроме того, IsEnabled равно "true" как только я добавлю источник в окно диагностических событий в Visual Studio.

Таким образом, источник регистрируется правильно, и метод Write выполняется успешно, но журнал фактически никогда не отправляется. Все выглядит так же, как когда я использую base(), но журналы не появятся, если я не использую этот конструктор. Что-то мне не хватает или это ошибка?

Согласно запросу Сулимана для всего кода, он находится в контроллере WebApi, работающем в службе Service Fabric:

public class TestController : ApiController
{
    [EventSource(Name = "TestSource")]
    public class TestSource : EventSource
    {
        public static readonly TestSource Log = new TestSource();

        public TestSource() : base()
        {
        }

        public void LogMe(string msg)
        {
            WriteEvent(1, msg);
        }
    }

    public IEnumerable<string> Get()
    {

        TestSource.Log.LogMe("Hello!");
        return new string[] {"value1", "value2"};
    }
}

(Эта версия работает, потому что в ней используется конструктор без параметров.)


person Mike D.    schedule 06.02.2017    source источник
comment
пожалуйста, добавьте весь код, который вы пытаетесь запустить   -  person Sulyman    schedule 07.02.2017
comment
добавить атрибут [Событие] в LogMe   -  person magicandre1981    schedule 07.02.2017
comment
Никаких изменений с добавленным атрибутом EventAttribute.   -  person Mike D.    schedule 08.02.2017
comment
используйте версию на основе Nuget, а не версию для почтового ящика: nuget.org/packages/Microsoft .Diagnostics.Tracing.EventSource   -  person magicandre1981    schedule 09.02.2017
comment
Спасибо, стоит попробовать. К сожалению, похоже, что ничего не изменилось - если я определяю имя с помощью EventSourceAttribute, EventSource продолжает нормально регистрироваться, но если я определяю его, вызывая конструктор (имя строки), никаких кубиков.   -  person Mike D.    schedule 09.02.2017
comment
Что вы используете для просмотра журналов? Я использовал средство просмотра «Диагностические события», и я вижу там вывод для версии, передающей параметр в базовый конструктор.   -  person Stringfellow    schedule 04.05.2017


Ответы (1)


Вам необходимо убедиться, что конструктор вашего базового класса виден для подклассов.

person Nothing    schedule 07.02.2017
comment
Спасибо, но я не уверен, что понимаю вашу озабоченность - EventSource является частью структуры (см. msdn.microsoft.com/en-us/library/), а не пользовательский код. Конструктор виден и доступен для подклассов, иначе это была бы проблема компиляции, а не проблема отсутствия журналов. - person Mike D.; 08.02.2017