如何使用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())
代码说明
- 预编译正则表达式,避免重复编译带来的性能损耗
- 自定义CSV表头,让生成的CSV文件可读性更强
- 逐行读取日志,跳过空行,匹配成功后直接将字段写入CSV
- 指定
utf-8编码,避免特殊字符或中文出现乱码问题
内容的提问来源于stack exchange,提问作者Black Orange
相关产品推荐
相关产品推荐

