2014-01-14 65 views
1

我需要創建一個系統來實時監控日誌,併發送一個警報,如果IP是外來的。Powershell:尾日誌和處理每一行

我更喜歡使用powershell(v2,由於服務器重新訓練)來實現這一點,因爲我已經有了一個系統來處理前一天的日誌,我可以重用很多功能。

我可以成功地拖尾文件(使用tail.exe)並選擇重要的行,但我似乎無法捕捉每一行並處理它。

的我有什麼基本要點是:

tail.exe -f \\server\file.log | where-object {$_ -match "criteria"} 

當我嘗試管道結果存入一個foreach,我什麼也沒得到。

有什麼建議嗎?

回答

2

只要運行tail命令就會阻塞管道。一種選擇是運行在一個後臺作業的尾巴,在一個無限循環處理主腳本的結果:

$Job = Start-Job -ScriptBlock { tail.exe -f \\server\file.log } 

While ($true){ 
Recieve-Job $Job | 
Where-Object { $_ -match "criteria" } 
Start-Sleep -Seconds 10 
} 
+0

這是行得通的。我可以從$ job獲得數據。問題是這項工作只是不斷追加數據。 我想我需要離開GC /尾巴並移動到某種streamReader。然後我可以輕鬆處理每一行。 – user3195248

+0

...但對於任何讀我背後的人,使用powershell v3和'-tail 1',您一次可以輕鬆處理它一個事件行。 – user3195248

+0

最終的解決方案是使用流。 '$ sr = new-object System.IO.StreamReader(new-object System.IO.FileStream(「$ filename」,「open」,「Read」,「ReadWrite」))''。 – user3195248

-1

只需使用Get-Content PowerShell Cmndlet,它將返回一個System.Array對象。

$Content = Get-Content "Path to log.log" | ? { $_ -match "something" } 
+0

'tail -f'「跟隨」一個文件,因爲附加數據正在追加到它。 'Get-Content'可以通過參數'-Wait'來實現,但是在PowerShell v3之前沒有引入,而OP限制爲v2。 –

+0

我很少需要在日誌中的瞬間警報,所以我錯過了。趕上安斯加。 – websch01ar

+1

實際上,'get-content -wait'在v2中,但'-Tail n'不是。所以,'gc -wait'與'tail.exe -f'實際上是一樣的。理想情況下,我會做'gc -wait -tail 1',它在v3上會一次給我一行,直到文件關閉。 但是,我相信'-wait'會像@ mjolinor提到的那樣阻塞管道。 – user3195248

0

如果必須使用「tail.exe」,用「&」,使線像在命令提示符中一樣執行所有操作。然後用「`n」(新行)分割輸出。之後,您可以找到符合要求的行,並將其寫入控制檯或將其寫入另一個日誌文件。

$log = "\\server\file.log" 
$tail = & tail.exe -f $log | ?{$_ -split "`n"} 
Foreach($line in $tail) 
{ 
    if($line -match "this") 
    { 
     Write-Host $line 
     Out-File -InputObject $line -FilePath \\server\important-logs.log 
    } 
} 
+0

對於PowerShell版本2,請嘗試: 'get-content \\ server \ file.log -Wait | ?{$ _ -match「criteria」}' 對於PowerShell版本4,請嘗試: 'Get-Content \\ server \ file.log -Tail 10 | ?{$ _ -match「criteria」}' '#-Tail 10可以是任意行數.' 我希望有幫助。 T.CK –