Защо EventRecord.FormatDescription() връща нула?

Когато използвате System.Diagnostics.Eventing.Reader.EventLogQuery за четене на събития от регистъра на събитията на Windows, методът EventRecord.FormatDescription() понякога връща нула. Защо е това? В Event Viewer има съобщения за събитията, които връщат нула.


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