Python 分析Nginx访问日志并保存到MySQL数据库实例

以下是详细的Python分析Nginx访问日志并保存到MySQL数据库实例的攻略:

1. 了解Nginx访问日志格式

在保存Nginx访问日志之前,我们需要了解Nginx日志格式的设置。默认情况下,Nginx日志格式的设置会输出一行类似以下的记录:

10.0.10.153 - - [17/Jan/2022:14:57:24 +0800] "GET /index.html HTTP/1.1" 200 663 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"

如果要保存更详细的信息,比如用户的访问时间、请求的URL等,我们可以在Nginx的配置文件中进行设置。下面是一些常见的Nginx日志格式设置:

  • $remote_addr:客户端IP地址。
  • $remote_user:客户端用户名。
  • $time_local:本地时间,格式是"DD/MM/YYYY:HH:MM:SS +时区"。
  • $request:请求的URI和协议。
  • $status:HTTP状态码。
  • $body_bytes_sent:返回的消息体大小,不包括HTTP头部。
  • $http_referer:来源页面的URL。
  • $http_user_agent:浏览器客户端的信息。

配置文件的示例如下:

http {
  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

  access_log  /var/log/nginx/access.log  main;
}

2. 使用Python解析Nginx日志文件

Python是一种流行的编程语言,也是一个强大的工具,可以用来解析Nginx日志文件。具体可以通过正则表达式对记录进行解析。

下面是一个示例,显示了如何使用Python从Nginx日志文件中提取关键信息:

import re

def nginx_parse_log(log_line):
    pattern = r'^(\S+) - (\S+) \[(.*?)\] "(.*?)" (\d+) (\d+) "(.*?)" "(.*?)"$'
    match = re.match(pattern, log_line)
    if not match:
        return None
    fields = match.groups()
    return {
        "remote_addr": fields[0],
        "remote_user": fields[1],
        "time": fields[2],
        "request": fields[3],
        "status": fields[4],
        "size": fields[5],
        "referer": fields[6],
        "user_agent": fields[7],
    }

# 示例:解析单行日志
log_line = '10.0.10.153 - - [17/Jan/2022:14:57:24 +0800] "GET /index.html HTTP/1.1" 200 663 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"'
parsed = nginx_parse_log(log_line)
print(parsed)

输出结果如下:

{
    "remote_addr": "10.0.10.153",
    "remote_user": "-",
    "time": "17/Jan/2022:14:57:24 +0800",
    "request": "GET /index.html HTTP/1.1",
    "status": "200",
    "size": "663",
    "referer": "-",
    "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
}

3. 将解析的信息保存到MySQL数据库实例

Python可以使用MySQL官方提供的Python客户端库——“mysql-connector-python”——连接MySQL服务并将数据写入数据库。

下面是示例代码,说明了如何将解析的Nginx日志数据存储到MySQL数据库中:

import mysql.connector

# 创建数据库连接
conn = mysql.connector.connect(
    user="root",
    password="password",
    host="127.0.0.1",
    port=3306,
    database="access_log",
    charset="utf8",
)

# 创建MySQL表
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS nginx_log (
    log_id INT(11) NOT NULL AUTO_INCREMENT,
    remote_addr VARCHAR(15),
    remote_user VARCHAR(20),
    time DATETIME,
    request TEXT,
    status SMALLINT(3),
    size INT(11),
    referer TEXT,
    user_agent TEXT,
    PRIMARY KEY (log_id)
)
""")

# 准备查询模板
query_template = (
    "INSERT INTO nginx_log "
    "(remote_addr, remote_user, time, request, status, size, referer, user_agent) "
    "VALUES "
    "(%(remote_addr)s, %(remote_user)s, %(time)s, %(request)s, %(status)s, %(size)s, %(referer)s, %(user_agent)s)"
)

# 处理日志文件
with open("/var/log/nginx/access.log") as f:
    for line in f:
        record = nginx_parse_log(line)
        if record:
            try:
                cursor.execute(query_template, record)
                conn.commit()
            except Exception as e:
                print("Failed to write record:", e)

# 关闭连接
cursor.close()
conn.close()

该代码将Nginx日志文件中的记录解析为Python的字典形式,然后将其写入MySQL数据库中。在Nginx日志文件中,记录的每行都代表一个字典形式的记录。程序会尝试将每条记录插入到名为“nginx_log”的MySQL表中。注意,在实现代码时,需要指定正确的数据库名称、用户名和密码信息。

4. 其它说明

上述示例仅为参考,实际情况下需要根据具体需求进行调整。例如,可能需要对解析的数据进行更复杂的处理,或者存储到不同的MySQL表中。此外,还需要注意到数据的处理效率,比如使用批量插入来提高写入和读取的效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python 分析Nginx访问日志并保存到MySQL数据库实例 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • 云计算平台(检索篇)-Elasticsearch-检索篇

             ES检索篇主要是对索引中的数据进行查询的一个过程: 1.IndexReader打开索引文件,读取并打开指向索引文件的流。 2.用户输入查询语句 3.将查询语句转换为查询对象Query对象树 4.构造Weight对象树,用于计算词的权重Term Weight,也即计算打分公式中与仅与搜索语句相关与文档无关的部分(红色部分)。 5.构造Scor…

    云计算 2023年4月10日
    00
  • python读取word文档的方法

    当我们需要处理一些Word文档时,可能会需要读取Word文档中的内容或者元数据。Python提供了多个库可以读取Word文档,其中最常用的有python-docx库和pywin32库。下面将详细讲解这两种方法的使用方法和示例。 1. 使用python-docx库读取Word文档 安装python-docx库 使用pip可以很方便地安装python-docx库…

    云计算 2023年5月18日
    00
  • ASP.NET Core3.X 终端中间件转换为端点路由运行详解

    下面是关于“ASP.NET Core3.X 终端中间件转换为端点路由运行详解”的完整攻略,包含两个示例说明。 简介 在ASP.NET Core 3.X中,终端中间件已被弃用,取而代之的是端点路由。端点路由是一种新的路由方式,它将路由和终端中间件合并到一起,提供了更加灵活和可扩展的路由方式。在本攻略中,我们将介绍如何将终端中间件转换为端点路由运行。 实现步骤 …

    云计算 2023年5月16日
    00
  • 三种工具帮助检测和管理云计算的使用

    如今企业所面临的首要问题之一,并不是他们是否已经采用了某种程度的云计算服务,而是他们是否能够高效、安全地管理他们的云计算迁移。太多的企业在发现一些业务部门或开发人员没有通过正当渠道把重要数据或应用程序迁移至上云时已为时太晚。 开发人员和IT专家充分使用云计算,将其作为一个扩展的数据中心/测试环境,而用户使用便捷的云计算服务来帮助他们更为高效地处理日常工作。但…

    云计算 2023年4月12日
    00
  • 大数据、云计算…34亿的新基建,怎么才能薅到这波“数字红利”

    十年前,我们错过了传统基建这一风口上的红利,十年后,新基建带着新的风口向我们招手,没薅到传统基建的羊毛,这次就一定要薅到新基建的羊毛,但是我们应该怎么才能薅到这波“数字红利”?      什么是新基建 4月20日,国家发改委召开新闻发布会,首次明确了新基建的范围,更是将5G、物联网、人工智能、云计算、区块链、大数据等词再一次带上热搜。在说新基建之前,我们要先…

    云计算 2023年4月13日
    00
  • asp.net上传图片保存到数据库的代码

    ASP.NET上传图片保存到数据库的代码 在ASP.NET中,我们可以使用文件上传控件来上传图片,并将其保存到数据库中。本文将提供一个完整攻略,包括如何在ASP.NET中上传图片,并将其保存到数据库中,并提供两个示例说明。 步骤1:创建数据库表 首先,我们需要创建一个数据库表,用于存储上传的图片。以下是一个示例说明,演示如何创建一个名为Images的表: C…

    云计算 2023年5月16日
    00
  • WPF简介与基础开发

    WPF简介与基础开发攻略 什么是WPF Windows Presentation Foundation(WPF)是一种用于创建 Windows 桌面应用程序的 UI 框架。它是.NET Framework的一部分,提供了强大的 XAML 语言(可扩展应用程序标记语言)用于创建用户界面,同时还提供了许多功能强大的控件和视觉效果。 通过 WPF,开发者可以轻松地…

    云计算 2023年5月17日
    00
  • 深入理解python虚拟机之多继承与 mro

    深入理解Python虚拟机之多继承与MRO — 完整攻略 1. 多继承的概念 多继承是指,在一个类中同时继承自多个父类。Python支持多继承,这使得我们能够从多个基类中继承特性和功能,使代码更加模块化和可重用。 2. MRO概念 MRO(Method Resolution Order)指的是在多继承中,当发生方法名冲突时,Python解释器会按照一定的顺序…

    云计算 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部