Почему EventRecord.FormatDescription() возвращает значение null?

При использовании System.Diagnostics.Eventing.Reader.EventLogQuery для чтения событий из журнала событий Windows метод EventRecord.FormatDescription() иногда возвращает значение null. Почему это? В средстве просмотра событий есть сообщения о событиях, которые возвращают null.


person JohannesH    schedule 23.09.2011    source источник


Ответы (2)


Это связано с ошибкой в ​​.NET framework.

В основном, что вам нужно сделать, чтобы обойти эту ошибку, это установить для CurrentCulture значение «en-US».

Пример:

var beforeCulture = Thread.CurrentThread.CurrentCulture;

try
{
  Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

  using (var session = new EventLogSession(ipOrAddress, userDomain, username, password, SessionAuthentication.Default))
  {
    var query = new EventLogQuery("System", PathType.LogName, queryString)
      {
        ReverseDirection = true,
        Session = session
      };

    using (var reader = new EventLogReader(query))
    {
      for (var record = reader.ReadEvent(); record != null; record = reader.ReadEvent())
      {
        // Read event records
        string message = record.FormatDescription();
      }
    }
  }
}
finally
{
  Thread.CurrentThread.CurrentCulture = beforeCulture;
}

Этот обходной путь is было очень сложно найти, поэтому я решил задокументировать его в месте, где он будет проиндексирован Google. Я нашел его в старом MS Connect. дело, но оно было закрыто со статусом "не исправлено".

ОБНОВЛЕНИЕ: ошибка была сообщается и для .NET 4, а статус "Отправлен инженерной команде на рассмотрение" и комментарий, намекающий на то, что ошибка может быть исправлена ​​в следующем основном выпуске .NET framework (v5 ).

person JohannesH    schedule 23.09.2011
comment
последний Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); должен быть Thread.CurrentThread.CurrentCulture = beforeCulture;, чтобы восстановить предыдущую культуру, верно? - person unruledboy; 25.03.2013
comment
Все та же проблема с .NET 4.5 в 2014 году. Однако, глядя на исходный код для FormatDescription, кажется, что это собственный вызов EvtFormatMessage, который выполняет форматирование. Поскольку сообщение журнала событий может быть локализовано, возможно, существует некоторая взаимосвязь между текущей культурой потока и языковым стандартом источника события. Однако с точки зрения .NET поведение просто сбивает с толку. - person Martin Liversage; 13.10.2014

поэтому я тоже боролся с этим несколько дней. Я не мог заставить его работать, изменив культуру. В конце концов, я просто использовал необработанные данные в свойстве Properties записи о событии. Данные сообщения находятся там, это просто некрасиво. (достаточно хорошо для моих потребностей в аудите :-))

person elvisbelt    schedule 05.02.2015