Я получаю это исключение при попытке чтения из журнала Windows с помощью метода C# EventRecord.FormatDescription():
System.Diagnostics.Eventing.Reader.EventLogException: The description string for parameter reference (%1) could not be found
at System.Diagnostics.Eventing.Reader.EventLogException.Throw(Int32 errorCode)
at System.Diagnostics.Eventing.Reader.NativeWrapper.EvtFormatMessageRenderName(EventLogHandle pmHandle, EventLogHandle eventHandle, EvtFormatMessageFlags flag)
at System.Diagnostics.Eventing.Reader.ProviderMetadataCachedInformation.GetFormatDescription(String ProviderName, EventLogHandle eventHandle)
Исключение возникает, когда текст события содержит строку %%, за которой следует длинное число (некоторые события из источника, который я не контролирую, содержат этот шаблон). Эти %% предназначены только для текста, я не ожидаю от Windows каких-либо интеллектуальных средств синтаксического анализа на этом этапе.
Знаете ли вы, что я могу сделать, чтобы .Net не выдавал эту ошибку, когда текст события содержит этот шаблон?
Вот команды PowerShell, которые вызовут исключение в следующий раз, когда вы попытаетесь прочитать событие из программы C#:
New-EventLog -LogName Application -Source MyApp
Write-EventLog -Source MyApp -LogName Application -Message "%%4294967295" -EventId 3
Я проверил, что делает Windows Event Viewer, он заменяет шаблоны, такие как %%0, на некоторые предопределенные строки, но оставляет только неизвестные коды, такие как %%4294967295. Напротив, Get-WinEvent в PowerShell вообще не пытается заменить (даже для %%0).





Обходной путь, который я в итоге реализовал, выглядит следующим образом:
private string FormatEventDescription(EventRecord eventRecord)
{
try
{
return eventRecord.FormatDescription();
}
catch (EventLogException e)
{
return eventRecord.ToXml();
}
}
Это менее чем удовлетворительно, поскольку этот XML неудобен для пользователя, но, по крайней мере, в нем есть вся необходимая информация на тот случай, если нам нужно знать исходное содержимое EventRecord. Обратите внимание, что XML не обязательно содержит строку описания внутри, иногда у этих событий есть список параметров, которые используются для заполнения шаблона сообщения для генерации строки описания, поэтому в этом случае вы получите необработанные параметры.
Строка, которую я не контролирую, находится внутри EventRecord, но она не дает мне доступа к необработанной строке. Я проверил это характеристики и методы, но не нашел ничего, что можно было бы использовать.