При использовании System.Diagnostics.Eventing.Reader.EventLogQuery
для чтения событий из журнала событий Windows метод EventRecord.FormatDescription()
иногда возвращает значение null. Почему это? В средстве просмотра событий есть сообщения о событиях, которые возвращают null.
Почему EventRecord.FormatDescription() возвращает значение null?
Ответы (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 записи о событии. Данные сообщения находятся там, это просто некрасиво. (достаточно хорошо для моих потребностей в аудите :-))