You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python将Nginx日志转换为CSV文件?

将Nginx日志转换为CSV的Python实现及正则表达式

适用的正则表达式

你提供的Nginx日志属于带upstream扩展字段的组合日志格式,对应的正则表达式可精准捕获每个字段:

^(\S+) (\S+) (\S+) \[([^\]]+)\] "(\S+) (\S+) (\S+)" (\d+) (\d+) "([^"]*)" "([^"]*)" (\d+) (\S+) \[([^\]]*)\] \[([^\]]*)\] (\S+) (\d+) (\S+) (\d+) (\S+)$

每个捕获组对应的字段依次为:

  • $1: 客户端IP
  • $2: 远程用户标识(通常为-)
  • $3: 认证用户(通常为-)
  • $4: 请求时间
  • $5: 请求方法
  • $6: 请求URL
  • $7: HTTP协议版本
  • $8: 响应状态码
  • $9: 响应字节数
  • $10: 来源页面(Referer)
  • $11: 用户代理(User Agent)
  • $12: 请求长度
  • $13: 请求处理耗时
  • $14: upstream集群名称
  • $15: upstream响应标识(通常为空)
  • $16: upstream服务器地址
  • $17: upstream响应字节数
  • $18: upstream处理耗时
  • $19: upstream响应状态码
  • $20: 请求ID

Python实现代码

直接用Python内置的re和csv模块就能完成转换,代码示例如下:

import re
import csv

# 预编译正则表达式,提升匹配效率
nginx_log_pattern = re.compile(r'^(\S+) (\S+) (\S+) \[([^\]]+)\] "(\S+) (\S+) (\S+)" (\d+) (\d+) "([^"]*)" "([^"]*)" (\d+) (\S+) \[([^\]]*)\] \[([^\]]*)\] (\S+) (\d+) (\S+) (\d+) (\S+)$')

# 定义CSV表头,对应每个捕获组的含义
csv_header = [
    "客户端IP", "远程标识", "认证用户", "请求时间",
    "请求方法", "请求URL", "HTTP版本", "状态码",
    "响应字节数", "来源页面", "用户代理", "请求长度",
    "处理耗时", "Upstream集群", "Upstream标识",
    "Upstream地址", "Upstream响应字节数", "Upstream处理耗时",
    "Upstream状态码", "请求ID"
]

# 读取日志并生成CSV
with open('nginx_access.log', 'r', encoding='utf-8') as log_file, open('nginx_logs.csv', 'w', newline='', encoding='utf-8') as csv_file:
    csv_writer = csv.writer(csv_file)
    csv_writer.writerow(csv_header)
    
    for line in log_file:
        line = line.strip()
        if not line:
            continue
        match_result = nginx_log_pattern.match(line)
        if match_result:
            csv_writer.writerow(match_result.groups())

代码说明

  1. 预编译正则表达式,避免重复编译带来的性能损耗
  2. 自定义CSV表头,让生成的CSV文件可读性更强
  3. 逐行读取日志,跳过空行,匹配成功后直接将字段写入CSV
  4. 指定utf-8编码,避免特殊字符或中文出现乱码问题

内容的提问来源于stack exchange,提问作者Black Orange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:12:45