我有一个日志文件列表,这些日志文件每天都在00:00:00创建,因此每天都会记录在一个单独的日志文件中。 4日志文件由于4种不同的原因每天都会被创建,我必须循环遍历它们并选择错误消息。
日志文件具有以下结构:
07.11.2016 12:00:41 Flag: Mandant=1, Modul=V, Pool=5
07.11.2016 12:00:41 Verarbeiten: M1, V, Pool 5, Dok 526198(), DokTyp 3, Skript BU-CO110.FF, Drucker 97
07.11.2016 12:00:41 fataler Fehler SalDocPoolItem_Process(5,): Err-226/VER-Dokument nicht gefunden: 0
07.11.2016 12:00:57 Flag: Mandant=1, Modul=V, Pool=5
07.11.2016 12:00:57 Verarbeiten: M1, V, Pool 5, Dok 526198(), DokTyp 3, Skript BU-CO110.FF, Drucker 97
07.11.2016 12:00:57 fataler Fehler SalDocPoolItem_Process(5,): Err-226/VER-Dokument nicht gefunden: 0
07.11.2016 12:01:13 Flag: Mandant=1, Modul=V, Pool=5
07.11.2016 12:01:13 Verarbeiten: M1, V, Pool 5, Dok 526198(), DokTyp 3, Skript BU-CO110.FF, Drucker 97
07.11.2016 12:01:13 fataler Fehler SalDocPoolItem_Process(5,): Err-226/VER-Dokument nicht gefunden: 0
你可以看到一条消息" fataler fehler"在每个块的底部,所以我需要将整个块放到一个数组中,然后发送所有" fataler Fehler"所有日志文件的块一起放在一个简单的电子邮件中。
现在我基本上都有代码,但是这段代码要么有错误,要么需要超过10分钟才能执行,因为我在开始编写这个问题前5分钟运行它,但它仍然没有完成。
目标:拥有$FailArray
变量
你能告诉我一个更好的方法来实现我的目标吗?我真的不喜欢两次使用get-content
,因为我觉得没有必要,我确信这比我的解决方案更好:
# Prepare Array
$FailArray = @()
# Search for Log Files
$a = gci "C:\path" -filter *.log | ? { $_.LastWriteTime -ge (get-date).AddDays('-1') }
# Loop over Log Files
$a | % {
# Are there errors in the log?
$x = get-content $_.FullName | ? { $_ -like "*Fehler*" }
# If there are errors in the block, get the "time stamp" of the Block, like 12:00:57
if ($x) { $y = $x | % { $_.split(' ')[1] } } else { return }
# Search the whole block, depending on the timestamp
$z = get-content $_.FullName | ? { $_ -like "*$y*" }
# Add found blocks to FailArray
$FailArray += $z
}
更多: 有时,块的第一个消息的时间戳与其他时间戳不同1秒 - 是否有可能以某种方式获得整个块? (只是一个很好的,没有必要)
07.11.2016 12:00:24 Flag: Mandant=1, Modul=V, Pool=5
07.11.2016 12:00:25 Verarbeiten: M1, V, Pool 5, Dok 526198(), DokTyp 3, Skript BU-CO110.FF, Drucker 97
07.11.2016 12:00:25 fataler Fehler SalDocPoolItem_Process(5,): Err-226/VER-Dokument nicht gefunden:
答案 0 :(得分:3)
您可以使用-context
参数并选择匹配项上方的两行+实际匹配项:
$FailArray = gci "C:\path" -filter *.log | ? { $_.LastWriteTime -ge (get-date).AddDays('-1') } | % {
Select-String -Path $_ -Pattern 'fataler Fehler' -Context 2,0 | foreach {$_.Context.PreContext; $_.Line}
}