解析Nginx日志

3

我正在尝试使用Python解析Nginx错误日志文件,以确定在过去的15分钟内是否发生了某些事情,然后根据此执行一些操作。

目前我还没有什么重要的进展,因为我完全不知道如何做到这一点。除了解析日志文件之外,我的脚本基本完成了所有我需要做的事情。我已经在Google和SO上查找过,但没有找到可以帮助我的内容。我已经找到了如何检查最后的10行,但这并不能解决时间问题。

我希望有人能给我一些指导,或者提供一个包括时间和错误消息(如下所示的需要查找的错误)的日志文件解析示例。

我知道现在没有代码,并且SO通常需要代码,但是我对这部分脚本没有任何东西可以展示,也认为没有更好的堆栈交换地方可以询问这个问题。对于软件工程师来说,这似乎有点基础。

这是我需要查找的日志文件条目的示例:

2019/03/15 14:22:59 [error] 14064#0: <error I need to find>, client: XXX.XXX.XXX.XXX, server: example.com, request: "POST /hello", host: "example.com"

1
你尝试过正则表达式吗? - D Malan
@DelenaMalan 没有,我很不擅长这个。但我相信我可以学会,只是需要创建日期/时间格式并进行比较。Python的new Date()版本是否与nginx日志采用相同的格式? - user9753902
1个回答

3
你可以使用正则表达式模式来查找日志中感兴趣的不同部分。你可以使用圆括号()将不同的部分隔离成“组”。例如,如果你想要获取日志文件中某行的日期和错误消息,你可以使用Python的re模块,像这样:
import re
pattern = `^(\d+/\d+/\d+ \d+:\d+:\d+)\s+\S+\s+\S+\s+(.+), client`
match = re.search(pattern, line) # where line is a single line in the log
date_time = match.group(0)
error_message = match.group(1)

你可以在这里查看我使用的每个模式部分并进行操作 here
由于你只对最近15分钟的日志感兴趣,你可以使用另一个正则表达式或Python的datetime 模块解析日期并将其与当前时间进行比较。你还可以将两者结合起来,编写一个不太复杂的模式,在将日期转换为datetime对象之前消除明显旧的日志。
从上面获取的日期字符串创建一个 datetime 对象,您可以使用 datetime.strptime 方法。它会根据格式将字符串解析为 datetime 对象。您可以使用 这里 列出的指令来指定格式。您可以编写以下类似的方法来检查日期字符串是否在过去的 15 分钟内:
from datetime import datetime, timedelta

MAX_DIFF = timedelta(minutes=15)
DATE_FORMAT = "%Y/%m/%d %H:%M:%S"  

def is_recent_date(date_string):
    current_time = datetime.now() 
    date_object = datetime.strptime(date_string, DATE_FORMAT)
    diff = current_time - date_object
    return diff < MAX_DIFF

哇,谢谢!这似乎正是我所需要的。我已经开始使用正则表达式(正如其他人建议的那样),但你的方法更好。 - user9753902
@JoshKirby 很高兴我能帮到你 :) - D Malan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接