从EventLog消息中提取一句话

时间:2018-08-05 21:42:50

标签: regex powershell event-log

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

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

$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. <Message>的{​​{1}}和</Message>标记之间的任何内容
  2. 无论$Event.Message的值是什么(句子或3-4个字符)

这两个东西似乎都位于[Key] :内部。

我的实际日志中可能有多种不同的内容,因此特别不能针对X字符进行拆分等。这不是一种选择,到目前为止,我所管理的是Reddit或Internet上一些海报的帮助一般。我尝试了各种RegEx组合,但都无济于事,而且我似乎无法全神贯注于如何使用RegEx。

我已经花了12个小时的大部分时间,只是为了使他的输出正确无误...我很茫然。

请帮助!

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

编辑:以下是每个请求的导出事件:

$Event.Message

1 个答案:

答案 0 :(得分:1)

运行这条班轮让我从$ 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/,它们解释了正则表达式的每个部分在测试字符串上的作用。