Строка описания для ссылки на параметр (% 1) не может быть найдена

Я получаю это исключение при попытке чтения из журнала 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

Строка, которую я не контролирую, находится внутри EventRecord, но она не дает мне доступа к необработанной строке. Я проверил это характеристики и методы, но не нашел ничего, что можно было бы использовать.

Daniel 12.06.2018 20:42

Я проверил, что делает Windows Event Viewer, он заменяет шаблоны, такие как %%0, на некоторые предопределенные строки, но оставляет только неизвестные коды, такие как %%4294967295. Напротив, Get-WinEvent в PowerShell вообще не пытается заменить (даже для %%0).

Daniel 12.06.2018 20:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
582
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обходной путь, который я в итоге реализовал, выглядит следующим образом:

    private string FormatEventDescription(EventRecord eventRecord)
    {
        try
        {
            return eventRecord.FormatDescription();
        }
        catch (EventLogException e)
        {
            return eventRecord.ToXml();
        }
    }

Это менее чем удовлетворительно, поскольку этот XML неудобен для пользователя, но, по крайней мере, в нем есть вся необходимая информация на тот случай, если нам нужно знать исходное содержимое EventRecord. Обратите внимание, что XML не обязательно содержит строку описания внутри, иногда у этих событий есть список параметров, которые используются для заполнения шаблона сообщения для генерации строки описания, поэтому в этом случае вы получите необработанные параметры.

Другие вопросы по теме