我需要创建一个脚本,该脚本将通过cron和parse syslog每5分钟运行一次,但只匹配执行时间最后5分钟内的条目。
如果有一个模块我可以利用其中的一部分?如果是这样,那么当日期提前一天午夜运行时它会起作用吗?我的日志的日期格式是:
Jun 20 14:04:47 <log msg details>
答案 0 :(得分:4)
您可以使用datetime
的strptime
功能:
>>> 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分钟内,您可以检查每一行。
你的问题是你必须在每次运行中解析整个系统日志,除非你将最后一个文件位置存储在某处。