【发布时间】:2016-03-23 10:11:03
【问题描述】:
我希望我的 Perl 脚本有一种更有效的方式来解析系统日志。
我的脚本每小时运行一次,以输出一些统计数据。我注意到随着时间的推移,完成几乎需要 5-10 分钟(系统日志每天存档),因为系统日志文件大小为几 GB,脚本执行简单:
open LOG, $logfile or die "fatal error. Could not open $logfile"
问题在于,最初几小时的日志是日志中的第一行。随着时间的推移,系统日志中日志条目的“当前时间”现在从第 600000 行到第 700000 行。所以每小时它变得越来越慢。
一种复杂的方法是根据时间对文件运行 grep 并将结果存储在 tmp 文件中,然后让我的 perl 脚本处理 tmp 文件,然后删除 tmp 文件,重复。
是否有更程序化的方式来确保我不会每次都重读数千行?
SK
【问题讨论】:
-
打开文件所需的时间与文件大小无关。 5 或 10 分钟的搜索时间即使是几 GB 也是很长的。你能发布实际的搜索代码吗?
-
我在
while (<LOG>) { $count++; print line $count\n"之后添加了一个打印,它以每秒 5000 行的速度递增。但是,到了第 7 个小时,我当前一小时的日志价值在 600000-70000 行。代码很长,而且在一个不在这个网络上的盒子上很难移植,因此是小的 sn-p。基本上,我不想每隔一小时重新阅读第 1-600000 行,因为我正在检查日志以获取当前小时的日志价值。希望这是有道理的。 -
实际搜索就在上面的打印之后,上面写着
if ($_ =~ /^$time_search_str/ ) {...do some stuff -
您可以将实际代码添加到帖子中吗?很难在 cmets 中对问题进行补充。编辑帖子更容易阅读,更有可能被其他人看到。您可能必须删除业务逻辑,但基本的“读取文件并查找正确的时间戳”应该是可发布的。
-
抱歉 Schwern,请阅读以上内容,它位于非互联网连接的盒子上,并且不容易输入。我仍在学习如何以更易读的方式发帖,抱歉。
标签: perl