.net - 让日志阅读更高效

标签 .net perl scripting powershell

我有一个用于监视数据库的 perl 脚本,我正在尝试将其编写为 powershell 脚本。

在 perl 脚本中,有一个函数可以读取错误日志并过滤掉重要的内容并将其返回。它还保存日志文件的当前位置,以便下次必须读取日志时,它可以从它离开的位置开始,而不是再次读取整个日志。这是通过使用 tell 函数来完成的。

我有一个使用 Get-Content cmdlet 的想法,并从最后一个位置开始读取,处理每一行直到文件末尾,然后保存该位置。

你知道有什么技巧可以让我在阅读后获取日志文件中的位置并使阅读从特定位置开始。

或者有没有更好和/或更简单的方法来实现这一目标?

吉斯利

编辑:这必须通过脚本完成,而不是使用其他工具。

编辑:所以我正在使用 .NET API 到达某个地方,但它对我来说不太好用。
我找到了一个有用的链接 herehere

这是我到目前为止所拥有的:

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。

我错过了什么????

吉斯利

最佳答案

你可能可以用一些 .net 对象等来做到这一点......

如果它是一个更标准的格式化日志文件,我不会看太多 logparser尽管。它在时间之前很棒,现在仍然很棒!

您可以通过命令行或 COM 与 PowerShell 一起使用它。它能够标记它在文件中的位置并从那里提取(将信息存储在 lpc 文件中)。

可能有人会想出一个很好的方法来做到这一点,但如果没有,您也可以考虑切换到将错误信息写入事件查看器。您可以存储最后一次 id 或上次搜索事件查看器的时间,并每次从那里进行检查。

希望有更好的东西......

编辑:

如果文件是制表符分隔的,您可以使用 import-csv 命令并存储最后一个数字(如果标题包含在计数中,它将是计数或计数-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

或者您可以使用 sp_readerrorlog 直接查询数据库;使用最后一次,就像上面的最后一次计数一样。

关于.net - 让日志阅读更高效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7027490/

相关文章:

linux - 脚本无法确认文件夹,即使它们存在

javascript - 是否可以从 IActiveScript 调用带有可变数量参数的 Delphi 方法?

bash - 调用名称存储在 bash 变量中的函数

php - 使用 CURL 访问我的家庭网络

.net - dll旁边的xml文件的用途是什么?

perl excel转pdf

c# - 什么是用于加载系统配置属性的 .net 层次结构

perl - 在 perl 中移动目录

c# - VS : Shutting the debugger but Keeping Application Form Open

c# - Path.Combine 和点符号