2011-08-12 27 views
0

我需要创建一个脚本,将通过cron运行每5分钟和解析系统日志,但只有最后5分钟的执行时间内匹配的条目。解析系统日志,只有匹配项

如果有一个模块,我可以利用这部分?如果是这样,在日期提前一天的午夜运行时它会工作吗?我的日志的日期格式为:

Jun 20 14:04:47 <log msg details> 

回答

3

您可以使用datetimestrptime功能:

>>> datetime.strptime("Jun 20 14:04:47", "%b %d %H:%M:%S") 
# => datetime.datetime(1900, 6, 20, 14, 4, 47) 

然后,您可以使用简单的运营商如<比较日期时间。 (你必须要注意,如果未指定年份,则默认为1900)

2

我不得不写连续解析系统日志脚本(认为“尾-f”),这样的情况下是略有不同,但也许这有助于反正。我使用这个正则表达式分析每一行。取决于你的系统日志实现,当然你必须适应。

pattern=re.compile("^(?P<month>[a-zA-Z]{3})\s+(?P<day>\d\d?)\s(?P<hour>\d\d)\:(?P<minute>\d\d):(?P<second>\d\d)(?:\s(?P<suppliedhost>[a-zA-Z0-9_-]+))?\s(?P<host>[a-zA-Z0-9_-]+)\s(?P<process>[a-zA-Z0-9\/_-]+)(\[(?P<pid>\d+)\])?:\s(?P<message>.+)$") 

那么我可以把它转换成一个DateTime对象

minute=int(m.group('minute')) 
hour=int(m.group('hour')) 
day=int(m.group('day')) 
second=int(m.group('second')) 
month=monthindex[m.group('month')] 
now=datetime.datetime.utcnow() 
year=now.year 
ts=datetime.datetime(year,month,day,hour,minute,second) 

,那么你可以检查每一行,如果该对象是最后的5分钟之内。

您的问题将是,你必须分析整个系统日志在每次运行,除非你存储的最后一个文件位置的某处。

+0

这基本上是我想要做的。我想不出一种简单的方法来存储文件在运行之间的位置,特别是当日志旋转时。我能想到的最简单的方法就是我描述的方法。不幸的是,“tail -f”不适合我。 –

+0

存储位置并不那么复杂。在你的文件对象上有'file.tell()',它返回当前字节号。此值存储在/ tmp下的文件,在接下来的运行,检查,如果该文件已被翻了个身(文件大小比去年更小的位置),在这种情况下,从一开始读。如果它仍然是相同的日志,则转发到最后一个位置:''file.seek(position)''并继续从那里读取 – Gryphius