问题:我监控实时系统,这些系统会生成许多非常大的日志文件,每天都会翻转,1GB并不罕见,我所做的就是查看已知错误条件的(尾端)日志或者我想监视的其他字符串,我可能需要采取行动.
由于这类工作耗时且繁琐,并且容易因人为错误而错过日志中的问题,因此我一直在自动执行此日志文件监控.我利用名为Servers Alive的产品执行计划检查,并编写脚本来监视日志文件,以查找我感兴趣的日志条目的出现,这可能表明服务有问题,我可以调用其他脚本重新启动服务解决遇到的问题.
我以前使用Perl完成了这些日志监控任务的脚本,这些脚本非常快,但不一定是最干净的方法,我是管理员而不是程序员所以我没有开发人员的方法或经验来依靠.
下面的Perl代码片段显示我’打开’一个日志文件$logfile,然后从文件末尾向后搜索给定数量的数据,然后我从这一点搜索数据到结束时我感兴趣的日志条目的文件,在这个例子中,日志条目是“没有从EISEC客户端收到的数据包”
在此示例中,我们正在监视的日志条目表明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不熟悉,知道如何使用这种方法快速到达大型日志文件的末尾,然后能够向后读取给定数量的数据,然后在此日志部分中搜索相关字符串.
有没有人有任何想法?
解决方法
# Returns the number of occurrences (get-content logfile.txt -Tail 1000 | select-string -pattern "No packet received from EISEC Client").Length