需要过滤日志以搜索最近5分钟的行

时间:2011-04-25 19:16:33

标签: regex perl datetime logfiles

2011-04-13 00:09:07,731 INFO [STDOUT] 04/13 00:09:07信息......

大家好。我会发布一些代码,但我认为它不值得发布。我正在尝试做的是我有一个包含上述行的日志文件。我需要做的是采取最后一行时间戳,并保留最后5分钟的所有行(而不是最后200行或其他......更容易)。有人可以帮忙吗?我在网上搜索了一些不错的提示,但仍然没有什么事情和沮丧的地狱。谢谢!

4 个答案:

答案 0 :(得分:5)

这是一个简单的Perl脚本,它遍历文件并打印每个行,其时间戳在执行开始时的5分钟内。为了提高效率,并假设行是按时间戳顺序排列的,您可以修改它以在遇到第一个可打印行时设置布尔标志,并从该点开始跳过测试。

#!/usr/bin/perl
use POSIX qw(mktime);

$now = time();
while(<>)
{
    ($yy,$mm,$dd,$h,$m,$s,$t) = /^(\d+)-(\d+)-(\d+)\s+(\d+):(\d+):(\d+),(\d+)/;
    $t = mktime($s+$t/1000, $m, $h, $dd, $mm-1, $yy-1900);
    print "$_" if ($t >= $now-300);
}

答案 1 :(得分:2)

我接受您最新的评论,您有兴趣了解如何查找日志中最后的时间戳,以及之前5分钟的条目。

我认为Jim Garrison的解决方案可以修补以取代它:

$now = time();

用这个:

open F, "<server.log" or die $!;
seek F,-1000,2; # set pos to last 1000 bytes
my @f = <F>;
$_ = $f[$#f];
($yy,$mm,$dd,$h,$m,$s,$t) = /^(\d+)-(\d+)-(\d+)\s+(\d+):(\d+):(\d+),(\d+)/;
$now = mktime($s+$t/1000, $m, $h, $dd, $mm-1, $yy-1900);

$now现在应该包含日志中的最后一个时间戳。

我将“-1000”近似为足以在日志中至少经过一行。如果你希望在日志中有长行,你可以设置得更高,但从我看到的,最后一个日志条目“应该”相当短。

如果您有一个巨大的日志文件并希望在以下搜索中提高性能,您可以使用估算并执行搜索以查找文件中的最后一个,例如1000000字节:

seek F, -1000000, 2;
祝你好运!

答案 2 :(得分:1)

使用regexp grab:00:09:07迭代所有行,并检查当前时间(本地时间等等)。 如果文件包含来自不同日期的条目,则还使用regexp获取日期,并再次使用locatime

的输出进行比较

答案 3 :(得分:0)

如何修改脚本以使其与下面的日志一起使用

Dec 18 09:41:18 sd
Dec 18 09:46:29 sds
Dec 18 09:48:39 sds
Dec 18 09:48:54 sds
Dec 18 09:54:47 sds
Dec 18 09:55:33 sds
Dec 18 09:55:38 sds
Dec 18 09:57:58 sds
Dec 18 09:58:10 sds
Dec 18 10:00:50 sdsd
Dec 18 10:03:43 sds
Dec 18 10:03:50 sdsd
Dec 18 10:04:06 sdsd
Dec 18 10:04:15 sdsd
Dec 18 10:14:50 wdad
Dec 18 10:19:16 sdadsa
Dec 18 10:19:23 dsds
Dec 18 10:21:03 sadsd
Dec 18 10:22:54 adas
Dec 18 10:27:32 qadad