如何解析 Apache 日志(提取字段做分析)?
解析 Apache 访问日志的方法:命令行工具(awk/grep/sed)快速提取、Python/Go 脚本批量分析、日志平台自动解析。本文对比各种方案。
Apache 访问日志默认是 Combined Log Format,字段包括 IP、时间、请求方法、URL、状态码、响应大小、Referer、User-Agent。解析方式取决于需求:快速排查用 awk/grep,批量分析用脚本,生产环境用日志平台。
日志格式示例
192.168.1.1 - - [15/Jan/2024:10:30:45 +0800] "GET /api/users HTTP/1.1" 200 1234 "https://example.com" "Mozilla/5.0 ..."
字段依次为:IP、-(identd,通常为空)、-(用户,通常为空)、时间、请求行、状态码、响应大小、Referer、User-Agent。
命令行快速分析
# 提取 IP 和 URL
awk '{print $1, $7}' access.log
# 统计访问量 TOP 10 的 IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
# 统计各状态码数量
awk '{print $9}' access.log | sort | uniq -c | sort -rn
# 找出 4xx/5xx 错误
awk '$9 >= 400 {print $1, $7, $9}' access.log
# 统计每小时的请求量
awk -F'[' '{print $2}' access.log | cut -d: -f1-2 | sort | uniq -c
Python 脚本解析
import re
pattern = re.compile(
r'(\S+) \S+ \S+ \[([^\]]+)\] "(\S+) (\S+) \S+" (\d+) (\d+)'
)
with open('access.log') as f:
for line in f:
m = pattern.match(line)
if m:
ip, time_str, method, url, status, size = m.groups()
print(f"{ip} {method} {url} -> {status}")
观测云对照
观测云提供 Nginx/Apache 集成,DataKit 自动采集访问日志,通过内置的 Pipeline grok 模板自动解析出所有字段,在控制台直接查看 QPS、状态码分布、TOP URL 等,不需要手写解析脚本。同时支持按状态码、URL 等条件配置告警。
常见问题(FAQ)
Q:awk 处理大日志文件慢怎么办?
A:awk 处理 GB 级文件可能需要几分钟。可以先用 grep 过滤缩小范围再交给 awk;或用 parallel/split 分片并行处理。
Q:日志格式不是默认的 Combined 怎么办?
A:查看 Apache 配置中的 LogFormat 指令确认自定义格式,然后调整解析脚本中的字段位置。
Q:如何分析某个时间段内的日志?
A:awk '/15\/Jan\/2024:10:/, /15\/Jan\/2024:11:/' access.log 提取 10 点到 11 点之间的记录。