从 EventLog 消息中提取一句话

Extract one sentence from an EventLog message

尝试只读取一系列事件中的一小部分消息。无法获得良好的输出。

我的脚本(假设所有变量都已正确设置,我能够收集到正确的事件等):

$Events = Get-WinEvent -ComputerName $Server -FilterHashtable @{LogName=$LogName;
StartTime=$StartTime} -ErrorAction SilentlyContinue
| Where-Object {$_.message -match "$Keyword1|$Keyword2"}

foreach ($Event in $Events)
{

    $InStuff = $Event.Message            

    $InStuff = $InStuff.Split("`n").Trim("`r")
    $Null = $InStuff.Where({$_ -match '<Message>(?<EventMessage>.+)</Message>'})
    $EventMessage = $Matches.EventMessage
    $Null = $InStuff.Where({$_ -match '\[Key\] : (?<EventKey>.+)'})
    $EventKey = $Matches.EventKey

    $EventXML = [xml]$Event.ToXml()
    $EventArray = New-Object -TypeName PSObject -Property @{

    EventID = $Event.Id
    EventTime = $Event.TimeCreated
    EventProvider = $Event.ProviderName
    EventLog = $Event.LogName
    EventMessage = $EventMessage
    EventKey = $EventKey
    }

    $EventArray | Select EventTime,EventLog,EventProvider,EventID,EventMessage,EventKey
} 

结果(注意,EventMessage 为空):

EventTime     : 7/30/2018 3:43:54 PM
EventLog      : CCS
EventProvider : CCS Logging
EventID       : 100
EventMessage  : 
EventKey      : R-MD

但是...如果在我的脚本中我这样做(手动粘贴日志的摘录):

$InStuff = @'
Timestamp: 7/30/2018 3:43:54 PM
    Message: <Description>An exception has been detected.</Description>
        <DateTime>2018-07-30 11:43:54Z</DateTime>
        <Message>Exception Message:No category found for key = R-MD.</Message>
    [Key] : R-MD
    [LocaleId] : 1033
'@

而不是这个:

$InStuff = $Event.Message

然后我得到了一个好的结果:

EventTime     : 7/30/2018 3:43:54 PM
EventLog      : CCS
EventProvider : CCS Logging
EventID       : 100
EventMessage  : Exception Message:No category found for key = R-MD.
EventKey      : R-MD

如果有帮助,$Event.Message.GetType() & $Event.Message[0].GetType() 会产生以下结果:

True | True | String | System.Object
True | True | Char | System.ValueType

基本上,回顾一下,我需要:

  1. $Event.Message
  2. <Message></Message> 标签之间的任何内容
  3. 无论 [Key] :
  4. 的值是什么(一个句子或 3-4 个字符)

这两个东西似乎都存在于 $Event.Message 中。

我的实际日志中可能包含多个不同的内容,因此特别针对 X 字符进行拆分等不是一个选项,到目前为止我所管理的是 Reddit 上一些海报的帮助或互联网一般。我尝试了各种 RegEx 组合,但发现无济于事,而且我似乎无法理解如何使用 RegEx。

我花了 12 小时的大部分时间只是为了让他的输出正确...我不知所措。

请帮忙!

=====================

编辑:下面是根据请求导出的事件:

<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
  <Obj RefId="0">
    <TN RefId="0">
      <T>System.Diagnostics.Eventing.Reader.EventLogRecord</T>
      <T>System.Diagnostics.Eventing.Reader.EventRecord</T>
      <T>System.Object</T>
    </TN>
    <ToString>System.Diagnostics.Eventing.Reader.EventLogRecord</ToString>
    <Props>
      <I32 N="Id">100</I32>
      <Nil N="Version" />
      <I32 N="Qualifiers">0</I32>
      <By N="Level">4</By>
      <I32 N="Task">0</I32>
      <Nil N="Opcode" />
      <I64 N="Keywords">36028797018963968</I64>
      <I64 N="RecordId">4824</I64>
      <S N="ProviderName">CCS LOGGING</S>
      <Nil N="ProviderId" />
      <S N="LogName">CCS</S>
      <Nil N="ProcessId" />
      <Nil N="ThreadId" />
      <S N="MachineName">Test</S>
      <Nil N="UserId" />
      <DT N="TimeCreated">2018-08-03T11:57:53-04:00</DT>
      <Nil N="ActivityId" />
      <Nil N="RelatedActivityId" />
      <S N="ContainerLog">ccs</S>
      <Obj N="MatchedQueryIds" RefId="1">
        <TN RefId="1">
          <T>System.UInt32[]</T>
          <T>System.Array</T>
          <T>System.Object</T>
        </TN>
        <LST />
      </Obj>
      <Obj N="Bookmark" RefId="2">
        <TN RefId="2">
          <T>System.Diagnostics.Eventing.Reader.EventBookmark</T>
          <T>System.Object</T>
        </TN>
        <ToString>System.Diagnostics.Eventing.Reader.EventBookmark</ToString>
      </Obj>
      <S N="LevelDisplayName">Information</S>
      <S N="OpcodeDisplayName">Info</S>
      <Nil N="TaskDisplayName" />
      <Obj N="KeywordsDisplayNames" RefId="3">
        <TN RefId="3">
          <T>System.Collections.ObjectModel.ReadOnlyCollection`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]</T>
          <T>System.Object</T>
        </TN>
        <LST>
          <S>Classic</S>
        </LST>
      </Obj>
      <Obj N="Properties" RefId="4">
        <TN RefId="4">
          <T>System.Collections.Generic.List`1[[System.Diagnostics.Eventing.Reader.EventProperty, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]</T>
          <T>System.Object</T>
        </TN>
        <LST>
          <Obj RefId="5">
            <TN RefId="5">
              <T>System.Diagnostics.Eventing.Reader.EventProperty</T>
              <T>System.Object</T>
            </TN>
            <ToString>System.Diagnostics.Eventing.Reader.EventProperty</ToString>
            <Props>
              <S N="Value">Timestamp: 8/3/2018 3:57:53 PM_x000D__x000A_Message: &lt;Exception handlingInstanceId="7bdbceed-ef96-4f0d-985a-88f7c8641661"&gt;_x000D__x000A_  &lt;DateTime&gt;2018-08-03 11:57:53Z&lt;/DateTime&gt;_x000D__x000A_  &lt;Message&gt;Exception Message Key:RDKEYNF_x000D__x000A_Exception Message:No record found in ApplicationLabels category for key = R-MD, Locale = 1033, Filter = Active, and EffectiveDate = 8/3/2018.&lt;/Message&gt;_x000D__x000A_  &lt;Source&gt;AFS&lt;/Source&gt;_x000D__x000A_  &lt;HelpLink /&gt;_x000D__x000A_  &lt;Property name="Parameters"&gt;_x000D__x000A_[CategoryName] : ApplicationLabels_x000D__x000A_[Key] : R-MD_x000D__x000A_[LocaleId] : 1033_x000D__x000A_</S>
            </Props>
          </Obj>
        </LST>
      </Obj>
    </Props>
    <MS>
      <S N="Message">Timestamp: 8/3/2018 3:57:53 PM_x000D__x000A_Message: &lt;Exception handlingInstanceId="7bdbceed-ef96-4f0d-985a-88f7c8641661"&gt;_x000D__x000A_  &lt;DateTime&gt;2018-08-03 11:57:53Z&lt;/DateTime&gt;_x000D__x000A_  &lt;Message&gt;Exception Message Key:RDKEYNF_x000D__x000A_Exception Message:No record found in ApplicationLabels category for key = R-MD, Locale = 1033, Filter = Active, and EffectiveDate = 8/3/2018.&lt;/Message&gt;_x000D__x000A_  &lt;Source&gt;AFS&lt;/Source&gt;_x000D__x000A_  &lt;HelpLink /&gt;_x000D__x000A_  &lt;Property name="Parameters"&gt;_x000D__x000A_[CategoryName] : ApplicationLabels_x000D__x000A_[Key] : R-MD_x000D__x000A_[LocaleId] : 1033_x000D__x000A_</S>
    </MS>
  </Obj>
</Objs>

运行 这个班轮让我从 $InStuff:

得到 <Message></Message> 之间的值
[regex]::matches($InStuff,'<Message>(.*?)<\/Message>').value.Replace("<Message>","")
.Replace("</Message>","").Trim()

输出:

Exception Message:No category found for key = R-MD.

对于 [Key] 值:

[regex]::matches($InStuff,'(?<=\[Key\]).*').value.Replace(":","").Trim()

输出:

R-MD

一个了解正则表达式的好网站是:https://regex101.com/,它们解释了正则表达式的每个部分在测试字符串上的作用。