Python - 从日志文件读取10分钟数据

0 投票
2 回答
1257 浏览
提问于 2025-04-18 14:35

我需要一个工具来读取我日志文件中最近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]

撰写回答