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

And*_*oll 4 powershell perl

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

问题:我监控实时系统,这些系统会生成许多非常大的日志文件,每天都会翻转,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; 

                }

            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

有没有人有任何想法?

Den*_*ton 5

如果使用PowerShell 3.0或更高版本,则可以使用get-contentselect-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
Run Code Online (Sandbox Code Playgroud)