2016-11-10 42 views
1

我有一個日誌文件列表,這些日誌文件每天都在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」,所以我需要這整個塊進入一個數組,然後通過簡單的電子郵件將所有日誌文件的所有「fleler 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

有多大的日誌文件? – vonPryz

+0

@vonPryz非常小 - 在45 KB到1600 KB之間 – SimonS

回答

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} 
} 
+0

工作起來就像一個魅力!我試圖在沒有最後一個foreach塊的情況下使用'-content 3,0'來最小化代碼,但是輸出的結構並不像您的那樣精美。謝謝! – SimonS

+0

3,0是不正確的,因爲你會選擇上面三行*你的匹配。你只想選擇2和實際的匹配線本身 - 這就是爲什麼我使用foreach。不客氣。 –