python - 解析 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"
解决方案
您可以使用正则表达式模式来查找您感兴趣的日志的不同部分。您可以使用圆括号(
和)
, 将不同部分隔离为“组”。例如,如果您对日志文件中某一行的日期和错误消息感兴趣,您可以使用 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
推荐阅读
- c++ - CreateFile 为两个相同的设备路径返回 INVALID_HANDLE_VALUE
- docker - 如何将使用堆栈管理的 Haskell 项目复制到另一台设备进行开发?
- c# - 在 Asp.Net webforms 应用程序中将复杂对象添加到会话存储失败
- android-context - 奇怪的Android FileNotFoundException:(只读文件系统)
- python-2.7 - 如何删除或重定向 URL,以使该 URL 在 Microsoft 图形 API 中没有“代码”?
- python - 在 windows 10 上的 python 2.7.12 中创建虚拟环境
- python - 为什么我的硒预期条件不能作为 python if 语句中的条件工作?
- javascript - firebase onAuthStateChanged 的问题:屏幕打开后立即忽略 forEach
- python - BeautifulSoup 属性错误
- php - register_shutdown_function 使用自定义代码退出