我有一个用于监视数据库的 perl 脚本,我正在尝试将其编写为 powershell 脚本。
在 perl 脚本中,有一个函数可以读取错误日志并过滤出重要的内容并将其返回。它还保存日志文件的当前位置,以便下次必须读取日志时,它可以从剩下的位置开始,而不是再次读取整个日志。这是通过使用tell功能。
我有一个想法使用 Get-Content cmdlet,并从最后一个位置开始读取,处理每一行直到文件末尾,然后保存该位置。
您是否知道任何技巧,以便我可以在读取后获取日志文件中的位置并使读取从特定位置开始。
或者是否有更好和/或更简单的方法来实现这一目标?
Gísli
编辑:这必须通过脚本完成,而不是使用其他工具。
编辑:所以我正在使用 .NET API,但它不太适合我。
我找到了有用的链接here https://stackoverflow.com/questions/4192072/how-to-process-a-file-in-powershell-line-by-line-as-a-stream and here https://stackoverflow.com/questions/1262965/c-how-do-i-read-a-specified-line-in-a-text-file
这是我到目前为止所拥有的:
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"
}
}
}
我还没有找到正确使用seek功能的方法。有人能指出我正确的方向吗?
如果我运行它,它会输出 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
其中第一部分是从日志中读取的行,末尾的数字表示在该点读取的字节数。正如您所看到的,我现在尝试使用查找函数来跳过第一个错误行,但正如我之前所说,如果我使用查找函数,输出将为 5270。
我缺少什么????
Gísli