Когато използвате System.Diagnostics.Eventing.Reader.EventLogQuery
за четене на събития от регистъра на събитията на Windows, методът EventRecord.FormatDescription()
понякога връща нула. Защо е това? В Event Viewer има съобщения за събитията, които връщат нула.
Защо EventRecord.FormatDescription() връща нула?
Отговори (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 ).
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
трябва да бъде Thread.CurrentThread.CurrentCulture = beforeCulture;
, за да се възстанови предишната култура, нали?
- person unruledboy; 25.03.2013
FormatDescription
, изглежда, че това е естественото извикване на EvtFormatMessage, който изпълнява форматирането. Тъй като съобщението в регистъра на събитията може да бъде локализирано, вероятно има известно взаимодействие между текущата култура на нишката и локала на източника на събитието. От гледна точка на .NET обаче поведението е просто объркващо.
- person Martin Liversage; 13.10.2014
така че и аз се боря с това от няколко дни. Не можах да го накарам да работи чрез промяна на културата. В крайна сметка просто използвах необработените данни в свойството Properties на записа на събитието. Данните за съобщението са там, просто не е красиво. (достатъчно добър за нуждите ми от одит обаче :-))