在 Python 中解析日志文件

Vaibhav Vaibhav 2022年5月17日
在 Python 中解析日志文件

日志文件包含有关在软件系统或应用程序运行期间发生的事件的信息。这些事件包括错误、用户提出的请求、Bug 等。开发人员可以进一步扫描这些使用细节,以找出系统潜在的问题,实施更新更好的解决方案,并改进整体设计。日志文件可以揭示很多关于系统安全性的信息,这有助于开发人员改进系统或应用程序。

通常,日志文件中的条目具有格式或模式。例如,一个软件系统可以有一个打印三样东西的格式:时间戳、日志消息和消息类型。出于可读性和管理目的,这些格式可以在格式良好的文本中包含任意数量的信息。

要对这些日志文件进行分析,可以考虑使用任何编程语言。但是本文将专门讨论如何使用 Python 解析此类日志文件。尽管如此,该过程背后的理论对于所有编程语言都是相同的。人们可以轻松地将 Python 代码转换为任何其他编程语言来执行所需的任务。

在 Python 中解析日志文件

如上所述,日志文件中的条目具有特定格式。这意味着我们可以利用这种格式逐行解析写入日志文件中的信息。让我们试着用一个例子来理解这一点。

考虑以下用于 Web 应用程序的日志格式。它有四个重要的细节,即日期和时间或时间戳(yyyy-mm-dd hh:mm:ss 格式)、访问的 URL、日志消息的类型(成功、错误等) ,以及日志消息。

DateTime | URL | Log - Type | Log

现在,考虑包含上述格式的日志的文件 log.txtlog.txt 文件看起来像这样。

2021-10-26 10:26:44 | https://website.com/home | SUCCESS | Message
2021-10-26 10:26:54 | https://website.com/about | SUCCESS | Message
2021-10-26 10:27:01 | https://website.com/page | ERROR | Message
2021-10-26 10:27:03 | https://website.com/user/me | SUCCESS | Message
2021-10-26 10:27:04 | https://website.com/settings/ | ERROR | Message
...

以下 Python 代码将读取此日志文件并将信息存储在字典中。变量 order 以与单个日志相同的顺序存储所有字典键。由于日志形式有一个|,我们可以使用它来将日志字符串拆分为元素并进一步存储我们喜欢的元素。

import json

file_name = "log.txt"
file = open(file_name, "r")
data = []
order = ["date", "url", "type", "message"]

for line in file.readlines():
    details = line.split("|")
    details = [x.strip() for x in details]
    structure = {key: value for key, value in zip(order, details)}
    data.append(structure)

for entry in data:
    print(json.dumps(entry, indent=4))

输出

{
    "date": "2021-10-20 10:26:44",
    "url": "https://website.com/home",
    "type": "SUCCESS",
    "message": "Message",
}
{
    "date": "2021-10-20 10:26:54",
    "url": "https://website.com/about",
    "type": "SUCCESS",
    "message": "Message",
}
{
    "date": "2021-10-20 10:27:01",
    "url": "https://website.com/page",
    "type": "ERROR",
    "message": "Message",
}
{
    "date": "2021-10-20 10:27:03",
    "url": "https://website.com/user/me",
    "type": "SUCCESS",
    "message": "Message",
}
{
    "date": "2021-10-20 10:27:04",
    "url": "https://website.com/settings/",
    "type": "ERROR",
    "message": "Message",
}

读取信息后,我们可以对其执行任何进一步的操作。我们可以将其存储在数据库中以供将来分析,导入 NumPyMatplotlib 并绘制一些图形以图形方式理解信息。过滤带有 ERROR 标签的日志并扫描用户面临的错误,或者注意一些可疑活动或安全漏洞,例如垃圾邮件或未经授权的访问。机会是无穷无尽的,这取决于开发人员或数据科学家正在尝试从获得的数据中学习什么。

作者: Vaibhav Vaibhav
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.