找不到参数引用(%1)的描述字符串

时间:2018-06-12 17:36:46

标签: c# .net windows event-log

尝试使用C#的方法EventRecord.FormatDescription()从Windows日志中读取时出现此异常:

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在事件文本包含该模式时抛出此错误?

下面是您尝试从C#程序读取事件时将导致异常的PowerShell命令:

New-EventLog -LogName Application -Source MyApp
Write-EventLog -Source MyApp -LogName Application -Message "%%4294967295" -EventId 3

1 个答案:

答案 0 :(得分:1)

我最终实现的解决方法如下:

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

这不能令人满意,因为XML不是用户友好的,但是至少它具有所有信息,以防我们需要了解EventRecord的原始内容。请注意,XML不一定在其中包含描述字符串,有时这些事件具有一列参数列表,这些参数用于填充消息模板以生成描述字符串,因此在这种情况下,您将获得原始参数。