我有一個用於監視數據庫的perl腳本,我試圖將它作爲powershell腳本編寫。使日誌讀取效率更高
在perl腳本中有一個函數,它讀取錯誤日誌,並過濾掉它重要的內容並將其返回。它還保存日誌文件的當前位置,以便下一次必須讀取日誌時,它可以從它離開的地方開始,而不是再次讀取整個日誌。這是通過使用告訴函數完成的。
我有一個想法,使用Get-Content cmdlet,並開始閱讀在最後的位置,處理每一行,直到文件的結尾,然後保存位置。
您是否知道任何技巧,以便在閱讀後可以在日誌文件中獲得位置,並在特定位置開始讀取。
還是有更好的和/或更簡單的方法來實現這一目標?
吉斯利
編輯:這必須通過腳本,而不是與其他一些工具來完成。
編輯:所以我得到的地方的.NET API,但它不是很適合我。 我發現了一個有用的鏈接here和here
這是我到目前爲止有:
function check_logs{
param($logs, $logpos)
$count = 1
$path = $logs.file
$br = 0
$reader = New-Object System.IO.StreamReader("$path")
$reader.DiscardBufferedData()
$reader.BaseStream.Seek(5270, [System.IO.SeekOrigin]::Begin)
for(;;){
$line = $reader.ReadLine()
if($line -ne $null){$br = $br + [System.Text.Encoding]::UTF8.GetByteCount($line)}
if($line -eq $null -and $count -eq 0){break}
if($line -eq $null){$count = 0}
elseif($line.Contains('Error:')){
$l = $line.split(',')
Write-Host "$line $br"
}
}
}
我還沒有找到一種方法來正確使用搜索功能。有人能指引我朝着正確的方向嗎?
如果我運行這個它輸出5270,但如果我跑這跟出來的線,我嘗試基本流中尋求我得到:
2011-08-12 08:49:36.51 Logon Error: 18456, Severity: 14, State: 38. 5029
2011-08-12 08:49:37.30 Logon Error: 18456, Severity: 14, State: 38. 5270
2011-08-12 16:11:46.58 spid18s Error: 1474, Severity: 16, State: 1. 7342
2011-08-12 16:11:46.68 spid18s Error: 17054, Severity: 16, State: 1. 7634
2011-08-12 16:11:46.69 spid29s Error: 1474, Severity: 16, State: 1. 7894
其中,第一部分是從日誌讀取的行而最後的數字表示在該點讀取的字節數。所以你可以看到我現在試圖使用seek功能跳過第一個錯誤行,但正如前面所說,如果我使用seek功能,輸出是5270。
我在想什麼?????
吉斯利
提及[tell](http://perldoc.perl.org/functions/tell.html)函數+1。我以前沒聽說過。只是想知道,你是否期望重寫腳本比安裝Perl更簡單或者是否存在需求問題? –
重寫是地獄,如果這就是你問的。問題是我們監控其他數據庫,這將使未來在新的Windows服務器上更容易設置。我還應該提到,今年夏天我是一名實習生,這個項目也是一種讓我學習代碼並理解腳本做什麼的方法。他們還希望有人開始學習PowerShell。簡而言之,安裝perl並使用該腳本可能會更容易。 – Gisli
不太清楚你現在要求什麼 - 我會再次閱讀,但檢查你的變量 - $ l是分裂的回報,但你正在寫$ line - 你的意思是? – Matt