首页 > 解决方案 > 解析 Nginx 日志

问题描述

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

我还没有什么重要的东西要展示,因为我完全不确定如何做到这一点。除了解析日志文件之外,我已经完成了脚本的其余部分。我查看了谷歌和 SO,但没有找到任何对我有帮助的东西。我想出了如何检查最后说的 10 行,但这并不能解决时间问题。

我希望有人能给我一些指导。或如何解析包含时间和错误消息的日志文件的示例 *如下所示error I need to find

我知道没有代码,所以通常需要代码,尽管我没有什么可以显示脚本的这一部分,并且不认为有更好的堆栈交换位置来问这个问题。对于软件工程来说似乎有点基础。

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

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"

标签: pythonlogging

解决方案


您可以使用正则表达式模式来查找您感兴趣的日志的不同部分。您可以使用圆括号(), 将不同部分隔离为“组”。例如,如果您对日志文件中某一行的日期和错误消息感兴趣,您可以使用 Python 的re模块,如下所示:

import re
pattern = `^(\d+/\d+/\d+ \d+:\d+:\d+)\s+\S+\s+\S+\s+(.+), client`
match = re.search(line, pattern) # where line is a single line in the log
date_time = match.group(0)
error_message = match.group(1)

您可以在此处查看我使用的模式的每个部分的用途并尝试使用它。

由于您只对最近 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

推荐阅读