我需要创建一个脚本,将通过cron运行每5分钟和解析系统日志,但只有最后5分钟的执行时间内匹配的条目。解析系统日志,只有匹配项
如果有一个模块,我可以利用这部分?如果是这样,在日期提前一天的午夜运行时它会工作吗?我的日志的日期格式为:
Jun 20 14:04:47 <log msg details>
我需要创建一个脚本,将通过cron运行每5分钟和解析系统日志,但只有最后5分钟的执行时间内匹配的条目。解析系统日志,只有匹配项
如果有一个模块,我可以利用这部分?如果是这样,在日期提前一天的午夜运行时它会工作吗?我的日志的日期格式为:
Jun 20 14:04:47 <log msg details>
您可以使用datetime
的strptime
功能:
>>> datetime.strptime("Jun 20 14:04:47", "%b %d %H:%M:%S")
# => datetime.datetime(1900, 6, 20, 14, 4, 47)
然后,您可以使用简单的运营商如<
比较日期时间。 (你必须要注意,如果未指定年份,则默认为1900)
我不得不写连续解析系统日志脚本(认为“尾-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分钟之内。
您的问题将是,你必须分析整个系统日志在每次运行,除非你存储的最后一个文件位置的某处。
这基本上是我想要做的。我想不出一种简单的方法来存储文件在运行之间的位置,特别是当日志旋转时。我能想到的最简单的方法就是我描述的方法。不幸的是,“tail -f”不适合我。 –
存储位置并不那么复杂。在你的文件对象上有'file.tell()',它返回当前字节号。此值存储在/ tmp下的文件,在接下来的运行,检查,如果该文件已被翻了个身(文件大小比去年更小的位置),在这种情况下,从一开始读。如果它仍然是相同的日志,则转发到最后一个位置:''file.seek(position)''并继续从那里读取 – Gryphius