Python - 从日志文件读取10分钟数据
我需要一个工具来读取我日志文件中最近10分钟的记录,如果有某些词被记录下来,就打印一些文本。
日志文件:
23.07.2014 09:22:11 INFO Logging.LogEvent 0 Failed login test@test.com
23.07.2014 09:29:02 INFO Logging.LogEvent 0 login test@test.com
23.07.2014 09:31:55 INFO Logging.LogEvent 0 login test@test.com
23.07.2014 09:44:14 INFO Logging.LogEvent 0 Failed login test@test.com
如果在过去10分钟内有记录显示为“Failed”,就打印“ALARM”。
我所做的就是找到“Failed”的匹配项,但我不知道怎么检查我日志文件中的最近10分钟;有没有什么主意??
from sys import argv
from datetime import datetime, timedelta
with open('log_test.log', 'r') as f:
for line in f:
try:
e = line.index("Failed")
except:
pass
else:
print(line)
2 个回答
-1
如果我是你,我会一行一行地查看,先找到第一行的时间戳,然后继续检查,直到第一行的时间和当前时间的差距超过10分钟,同时统计“Failed”这个词出现的次数。
我觉得你可以通过空格来分割你的每一行。不过要小心,如果有一天你的日志格式变了,你的脚本可能就不管用了。
0
你使用的格式 %d.%m.%Y
比 %Y:%m:%d
差,因为后者可以用来进行字符串比较。
我们也不知道日志文件有多大,以及它是否已经排序。如果没有排序(这在多线程应用中很常见),你就需要逐行分析每一行,并把它转换成日期时间格式:
def get_dt_from_line(s):
return datetime.datetime.strptime(s[:20], '%d.%m.%Y %H:%M:%S')
然后可以用它作为过滤条件(适合小文件):
MAX_CHECK_TIMEDELTA = datetime.timedelta(minutes=10)
LOG_START_ANALYZE_DATETIME = (datetime.datetime.today() - MAX_CHECK_TIMEDELTA)
lines = [s for s in TXT.split('\n') if 'Failed' in s and get_dt_from_line(s) >= LOG_START_ANALYZE_DATETIME]
print('\n'.join(lines))
对于大文件,你可以逐行读取文件。
如果你的日志文件只包含一天的数据,你可以用字符串比较来代替日期时间比较:
LOG_START_ANALYZE_DATETIME = (datetime.datetime.today() - datetime.timedelta(minutes=10)).strftime('%d.%m.%Y %H:%M:%S')
lines = [s for s in TXT.split('\n') if 'Failed' in s and s >= LOG_START_ANALYZE_DATETIME]