在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" } }
}
我还没有找到正确使用搜索功能的方法.有人能指出我正确的方向吗?
如果我运行它输出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,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,State: 1. 7634 2011-08-12 16:11:46.69 spid29s Error: 1474,State: 1. 7894
第一部分是从日志中读取的行,最后的数字表示在该点读取的字节.所以你可以看到我现在正试图使用搜索功能跳过第一个错误行,但正如我之前所说,如果我使用搜索功能,则输出为5270.
我错过了什么?????
吉斯利
解决方法
如果它是一个更标准的格式化日志文件,我看起来不会超过logparser.它在时间之前很棒,仍然很棒!
您可以通过命令行或COM与PowerShell一起使用它.它能够标记文件中的位置并从那里拾取(将信息存储在lpc文件中).
可能有人会提出一个很好的方法来做到这一点,但如果没有,你也可以看看切换到事件查看器写错误信息.您可以存储最后一个ID或上次搜索事件查看器并每次检查.
希望有更好的东西……
编辑:
如果文件是制表符分隔的,则可以使用import-csv命令并存储最后一个数字(如果计数中包含标题,则它可以是count或count-1).使用最后一个数字,您可以跳转到文件中的最后一个点
# use Import-CliXML to get the $last_count Import-CliXML $path_to_last_count_xml $file = Import-Csv filename -delimiter "`t" for ($i=$last_count; $i -gte $file.count; $i++) { $line = $file[$i] # do something with $line ... } $last_count = $file.count | Export-CliXML $path_to_last_count_xml # use this to clear the memory Remove-Variable $file [GC]::collect