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日

相关文章

  • 泛谈云计算

    Photo by Avi Richards on Unsplash “大数据与云计算”可谓是当今很火热的两个词,许多相关的竞赛、项目不断捧热这些新型的词汇。但是究竟什么才是云计算,它究竟可以带给我们什么变革?本文按照作者个人认识行文,试图以最简单的方式传达作者对于云计算的思考。 什么是云计算 某些课程讲过云计算,课上我说我用过云计算,结果被反问“你用云计算计…

    云计算 2023年4月13日
    00
  • Asp.Net Core中创建多DbContext并迁移到数据库的步骤

    下面是关于“Asp.Net Core中创建多DbContext并迁移到数据库的步骤”的完整攻略,包含两个示例说明。 简介 在Asp.Net Core中,我们可以创建多个DbContext来管理不同的数据库。本攻略中,我们将介绍如何创建多个DbContext,并将其迁移到数据库中。 步骤 在使用Asp.Net Core创建多个DbContext并迁移到数据库时…

    云计算 2023年5月16日
    00
  • Python实现多进程共享数据的方法分析

    Python实现多进程共享数据的方法分析 在Python中,多进程通信是实现多进程编程的重要组成部分。在多进程的处理过程中,为了共享数据,需要实现多进程间的数据共享。本文主要介绍Python实现多进程共享数据的方法,通过multiprocessing模块实现多进程数据共享。 共享内存 共享内存是一种实现多进程共享数据的方法。Python multiproce…

    云计算 2023年5月18日
    00
  • Java之SpringCloud nocos注册中心讲解

    Java之SpringCloud nacos注册中心讲解 什么是SpringCloud nacos注册中心 SpringCloud nacos是一个开源的动态服务发现、配置管理和服务管理平台,支持多种协议(Dubbo、gRPC、HTTP、Spring Cloud等)和多种数据格式(properties、yaml、json等),提供了一种简单的方式来管理微服务…

    云计算 2023年5月16日
    00
  • 阿里云流计算专场-GitHub上相关文档

    阿里云流计算专场-GitHub路径:https://github.com/Alibaba-Technology/hangzhouYunQi2017ppt

    云计算 2023年4月9日
    00
  • 实现云计算平台即服务PaaS安全性的五步(图文)

    实现云计算平台即服务PaaS安全性的五步(图文) 云计算平台即服务(PaaS)是一种云计算服务模式,它提供了一个平台,使开发人员可以在上面构建、部署和管理应用程序。在使用PaaS时,安全性是一个非常重要的问题。本文将介绍实现云计算平台即服务PaaS安全性的五个步骤,包括内容: 步骤一:了解PaaS安全性 步骤二:评估PaaS提供商的安全性 步骤三:选择安全的…

    云计算 2023年5月16日
    00
  • .NET6环境下实现MQTT通信及详细代码演示

    下面是关于“.NET6环境下实现MQTT通信及详细代码演示”的完整攻略,包含两个示例说明。 简介 MQTT是一种轻量级的消息传输协议,适用于物联网等场景。在.NET6环境下,我们可以使用MQTTNet库来实现MQTT通信。在本攻略中,我们将介绍如何在.NET6环境下实现MQTT通信,并提供两个示例说明。 步骤 在.NET6环境下实现MQTT通信时,我们可以通…

    云计算 2023年5月16日
    00
  • 什么是网络虚拟化 网络虚拟化简介

    什么是网络虚拟化 网络虚拟化是一种将物理网络资源划分为多个逻辑网络的技术,可以提高网络资源的利用率和灵活性。网络虚拟化可以将多个虚拟网络隔离开来,使它们之间相互独立,从而提高网络的安全性和可靠性。下面是一些网络虚拟化的攻略。 1. 虚拟化技术 网络虚拟化可以使用多种虚拟化技术,包括: 虚拟局域网(VLAN):将物理网络划分为多个逻辑网络,每个逻辑网络都有一个…

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