【发布时间】:2011-10-25 01:03:27
【问题描述】:
我有一个用于监视数据库的 perl 脚本,我正在尝试将其编写为 powershell 脚本。
在 perl 脚本中有一个函数可以读取错误日志并过滤掉重要的内容并将其返回。它还保存日志文件的当前位置,以便下次它必须读取日志时,它可以从它离开的地方开始,而不是再次读取整个日志。这是通过使用 tell 函数完成的。
我有一个使用 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"
}
}
}
我还没有找到正确使用 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
其中第一部分是从日志中读取的行,末尾的数字表示在该点读取的字节数。如您所见,我现在正尝试使用 seek 函数跳过第一个错误行,但正如我之前所说,如果我使用 seek 函数,输出为 5270。
我错过了什么??????
吉斯利
【问题讨论】:
-
+1 用于提及 tell 函数。我以前没听说过。只是想知道,您是否认为重写脚本比安装 Perl 更容易,还是涉及到需求问题?
-
如果这就是你所要求的,那么重写就是地狱。问题是我们监视其他人的数据库,这将使将来在新的 Windows 服务器上的设置更容易。我还应该提到,今年夏天我是一名实习生,这个项目也是让我学习代码并了解脚本在做什么的一种方式。他们还希望有人开始学习 powershell。所以简而言之,安装 perl 并使用该脚本可能会更容易。
-
目前不太确定您要的是什么-我会再读一次,但请检查您的变量-$l 是拆分的返回,但您正在编写 $line-您的意思是那个?
标签: .net perl scripting powershell