EventSource не ведет журнал

Я использую блок приложения Semantic Logging, и у меня есть следующие два класса на основе EventSource (внутренние постоянные классы опущены для краткости:

[EventSource(Name = EventSourceNames.Prism)]
public sealed class PrismEventSource: EventSource
{
  public static PrismEventSource Log = new PrismEventSource();
  [Event(1, Keywords = EventKeywords.None, Level = EventLevel.Informational)]
  public void PrismEvent(string message, Category category, Priority priority)
  {
    if (IsEnabled())
    {
      WriteEvent(1, message, category);
    }
  }
}

и

[EventSource(Name = EventSourceNames.Application)]
public sealed class ApplicationEventSource : EventSource
{
  public static ApplicationEventSource Log = new ApplicationEventSource();
  [Event(2, Message = "Duplicate menu item: {0}", Keywords = Keywords.Menu, Level = EventLevel.LogAlways, Task = Tasks.ImportMenu)]
  public void DuplicateMenuItem(string menuItemPath)
  {
    if (IsEnabled())
    {
      WriteEvent(2, menuItemPath);
    }
  }
}

У меня есть одиночный слушатель проекта для обоих:

RollingLog = RollingFlatFileLog.CreateListener("XTimeDev.log", 2048, "yyyyMMdd HHmmss", RollFileExistsBehavior.Overwrite, RollInterval.None);
RollingLog.EnableEvents(EventSourceNames.Prism, EventLevel.LogAlways);
RollingLog.EnableEvents(EventSourceNames.Application, EventLevel.LogAlways);

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

try
{
  Current.RegisterMenuItem(xtimeItem);
}
catch (ArgumentException ax)
{
  ApplicationEventSource.Log.DuplicateMenuItem(ax.Message);
} 

Все, что я вижу в своем файле журнала, — это события запуска, которые Prism регистрирует через свой источник событий, который я указал в MefBootstrapper.CreateLogger:

class BootLogger : ILoggerFacade
{
  public void Log(string message, Category category, Priority priority)
  {
    PrismEventSource.Log.PrismEvent(message, category, priority);
  }
}

Почему только PrismEventSource, а не ApplicationEventSource должны записывать в файл?


person ProfK    schedule 16.04.2014    source источник
comment
Вы убедились, что IsEnabled возвращает true в методе DuplicateMenuItem?   -  person Matt    schedule 17.04.2014
comment
@ Мэтт, действительно есть.   -  person ProfK    schedule 20.04.2014


Ответы (1)


Сигнатура вашего метода не соответствует количеству параметров, которые вы передаете WriteEvent.

Если вы измените его на это, он должен работать:

public void PrismEvent(string message, Category category, Priority priority)
{
  if (IsEnabled())
  {
    WriteEvent(1, message, category, priority);
    //                                 ^  ^
  }
}

Для правильной работы необходимы совпадающие подписи.


Вы можете обнаруживать подобные проблемы в будущем в модульном тесте, используя EventSourceAnalyzer. Я рекомендую использовать его, так как он найдет эти ошибки намного быстрее.

person Kendall Frey    schedule 30.04.2014
comment
Спасибо за подсказку о EventSourceAnalyszer, но WriteEvent не знает, сколько параметров передается PrismEvent, поэтому не может обнаружить несоответствие. У него есть перегрузки, допускающие от 1 до 3 строковых параметров и даже тот, который принимает params object[]. Кроме того, это единственное, что действительно работает. Как я уже сказал, все, что я вижу в своем файле журнала, — это события запуска, которые Prism регистрирует через свой источник событий, который вы цитируете. Спасибо также за указание на мою маленькую ошибку. - person ProfK; 01.05.2014
comment
Обычный метод C# не может обнаружить это, но источник события может, и это вызовет проблемы. Я думаю, что это происходит в реестре для сигнатур событий. Также может случиться так, что источник событий Prism каким-то образом нарушает работу источника событий Application, который включается после него. - person Kendall Frey; 01.05.2014
comment
Другие вещи, которые приходят мне в голову: Log — это поле, где обычно это свойство. У вас могут быть общедоступные методы или свойства (или даже события!), которые не являются событиями и не помечены [NonEvent]. Я знаю, что это может привести к ошибкам. - person Kendall Frey; 01.05.2014