gpt4 book ai didi

perl - 使用 Powershell 在非常大的日志文件的最后 x 行中搜索特定字符串

转载 作者:行者123 更新时间:2023-12-04 17:37:35 26 4
gpt4 key购买 nike

我有一个要求,到目前为止我还没有在论坛上找到解决方案或帮助...

问题:我监控实时系统,这些文件每天都会生成许多非常大的日志文件,1GB 并不少见,我所做的是查看(尾部)日志以了解已知错误情况或我想监视的其他字符串,我可能需要对其采取措施。

由于这种工作既费时又乏味,并且容易因人为错误而错过日志中的问题,因此我一直在自动化此日志文件监控。我使用名为 Servers Alive 的产品执行计划检查,并编写脚本来监视日志文件中出现的日志条目,我有兴趣查找这些条目可能表明服务存在问题,如果需要,我可以调用其他脚本来重新启动服务来解决遇到的问题。

我以前使用 Perl 为这些日志监控任务编写脚本,这些脚本非常快,但不一定是最干净的方法,我是管理员而不是程序员,所以我没有开发人员方法或经验依靠。

下面的 Perl 代码片段显示我“打开”了一个日志文件 $logfile ,然后从文件末尾向后“搜索”给定数量的数据,然后我搜索从这一点到文件末尾的数据,以查找我有兴趣监控的日志条目,在本例中为日志条目是“No packet received from EISEC Client

在此示例中,我们正在监视的日志条目表明 EISEC 服务存在问题,并且该服务的简单重启通常可以解决该问题,所有这些都是我自动使用 Servers Alive 作为计划检查和警报机制的。

Perl 脚本函数

sub checkEisecSrvloggedon {

print "$logfile\n";

if (open (EISECSRV_LOGGEDON, $logfile)) {

seek (EISECSRV_LOGGEDON, -40000, 2);

$line = <EISECSRV_LOGGEDON>;

$eisecsrvloggedon_ok = 0;

while ($line = <EISECSRV_LOGGEDON>) {

if ($line =~/No packet received from EISEC Client/) {

#increment counter
++$eisecsrvloggedon_ok;

}

}
}
}

如果可能的话,我想使用 PowerShell 实现一个解决方案,因为我们已经转移到 Windows Server 2008 R2 和 Windows 7 客户端,但我找不到有关如何快速有效地执行此操作的详细信息,并且没有任何大量内存开销。

我尝试过基于 Get-Content 的解决方案,但需要读取整个日志文件使得这些类型的解决方案无法使用,因为查询日志文件需要很长时间。我需要能够定期检查这些大型日志文件中的一些,在某些情况下每隔几分钟检查一次。我已经看到尾类型解决方案非常适合拖尾日志文件的末尾,这些脚本使用 System.IO.File方法。这确实获得了我想在我的脚本中实现的性能/速度,但我对 PowerShell 不够熟悉,不知道如何使用这种方法快速到达大型日志文件的末尾,然后能够向后读取给定数量的数据,然后在此日志部分中搜索相关字符串。

有没有人有任何想法?

最佳答案

如果您使用 PowerShell 3.0 或更新版本,则可以使用 get-content 的组合。和 select-string命令来获得相同的功能。从 3.0 版开始,get-content支持-tail仅以有效方式返回文件的最后 n 行的选项。使用它,您可以使用以下内容重新实现上面的 Perl 脚本(在最后 1000 行中搜索):

# Returns the number of occurrences
(get-content logfile.txt -Tail 1000 | select-string -pattern "No packet received from EISEC Client").Length

关于perl - 使用 Powershell 在非常大的日志文件的最后 x 行中搜索特定字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13624403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com