解析syslog并仅匹配最近x分钟内的条目

时间:2011-08-12 05:33:34

标签: python

我需要创建一个脚本,该脚本将通过cron和parse syslog每5分钟运行一次,但只匹配执行时间最后5分钟内的条目。

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

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

2 个答案:

答案 0 :(得分:4)

您可以使用datetimestrptime功能:

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

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

答案 1 :(得分:2)

我必须编写一个连续解析syslog的脚本(想想“tail -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>.+)$")

然后我可以将它转换为日期时间对象

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分钟内,您可以检查每一行。

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