解析Nginx日志

时间:2019-06-06 15:04:43

标签: python logging

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

我没有什么可展示的,因为我完全不确定该怎么做。我完成了脚本的其余部分,从某种意义上说,它完成了我需要的所有工作,除了解析日志文件。我已经看过谷歌,所以还没有找到任何对我有帮助的东西。我想出了如何检查最后说的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"

1 个答案:

答案 0 :(得分:2)

您可以使用正则表达式模式找到您感兴趣的日志的不同部分。您可以使用圆括号()将不同的部分分成“组” 。例如,如果您对日志文件中某行的日期和错误消息感兴趣,则可以使用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)

您可以查看我使用的模式的每个部分的用途,并here进行尝试。

由于您只对最近15分钟的日志感兴趣,因此可以使用其他正则表达式或Python的datetime模块来解析日期并将其与当前时间进行比较。您还可以将两者结合起来并编写一种不太复杂的模式,该模式可以在将日期转换为datetime对象之前消除明显的旧日志。

要从上面获得的日期字符串创建datetime对象,可以使用datetime.strptime方法。它将字符串解析为给定格式的datetime对象。您可以使用here中列出的指令来指定格式。您可以编写这样的方法来检查日期字符串是否在过去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
相关问题