如何利用Nginx日志做内容分析
导读:整体思路与准备 明确目标:围绕流量、错误、性能、安全四大类问题,沉淀可复用的分析流程与报表。 规范日志:在 Nginx 配置中统一日志格式,至少包含常用字段;如需结构化分析,建议输出为 JSON。示例:log_format main '$...
整体思路与准备
- 明确目标:围绕流量、错误、性能、安全四大类问题,沉淀可复用的分析流程与报表。
- 规范日志:在 Nginx 配置中统一日志格式,至少包含常用字段;如需结构化分析,建议输出为 JSON。示例:
说明:访问日志用于行为与性能分析,错误日志用于定位 4xx/5xx 等问题。JSON 格式便于在 ELK/Loki 等系统中解析与聚合。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; error_log /var/log/nginx/error.log; log_format json_analytics escape=json '{ ' '"msec":"$msec","connection":"$connection",' '"request_id":"$request_id","request":"$request",' '"status":$status,"body_bytes_sent":$body_bytes_sent,' '"http_referer":"$http_referer","http_user_agent":"$http_user_agent",' '"remote_addr":"$remote_addr","http_x_forwarded_for":"$http_x_forwarded_for"' '} '; access_log /var/log/nginx/access_json.log json_analytics;
解析与字段提取
- 命令行快速解析(适合临时排查)
- 提取并统计状态码分布:
awk '{ print $9} ' access.log | sort | uniq -c | sort -nr - 统计 Top IP、Top URL、按时间段统计等:
# Top 10 IP awk '{ print $1} ' access.log | sort | uniq -c | sort -nr | head -10 # Top 10 URL(按请求行第7列,适配常见 combined 格式) awk '{ print $7} ' access.log | sort | uniq -c | sort -nr | head -10 # 某时间段的请求数(示例:04/Apr/2017:04-05 点) grep "07/Apr/2017:0[4-5]" access.log | wc -l
- 提取并统计状态码分布:
- 结构化解析(适合长期复用)
- 使用 GROK(或正则)将日志解析为结构化字段,便于后续多维统计与可视化。示例(示意,按实际格式调整):
说明:GROK 模式库丰富、学习成本低,适合快速解析多变日志;必要时可与正则组合使用。e_regex("content", r'(?P< ip> \S+) - - \[(?P< datetime> [^\]]+)\] ' r'"(?P< verb> \S+) (?P< request> \S+) (?P< protocol> \S+)" ' r'(?P< status> \d+) (?P< body_bytes_sent> \d+) ' r'"(?P< referer> [^"]*)" "(?P< user_agent> [^"]*)"')
- 使用 GROK(或正则)将日志解析为结构化字段,便于后续多维统计与可视化。示例(示意,按实际格式调整):
常见分析场景与命令示例
- 错误与异常定位
- 按状态码快速筛选与计数:
# 全部 404 grep " 404 " access.log | head # 各状态码计数 awk '{ print $9} ' access.log | sort | uniq -c | sort -nr # Top 10 404 路径 awk '$9==404 { print $7} ' access.log | sort | uniq -c | sort -nr | head -10 - 结合时间窗口定位突发异常:
# 最近 10 分钟 5xx 数量 tail -n 100000 access.log | grep "$(date -d '10 minutes ago' '+%d/%b/%Y:%H:%M')" | awk '$9> =500 { count++} END { print count+0} '
- 按状态码快速筛选与计数:
- 流量与用户行为
- Top N 分析(IP、URL、Referer、UA):
# Top IP awk '{ print $1} ' access.log | sort | uniq -c | sort -nr | head # Top URL awk '{ print $7} ' access.log | sort | uniq -c | sort -nr | head # Top Referer / UA(按列位置或解析后字段)
- Top N 分析(IP、URL、Referer、UA):
- 性能与可用性
- 若日志包含请求耗时字段(如 $request_time/$upstream_response_time),可定位慢请求:
# 假设第10列为 $request_time(单位秒) awk '$10 > 1.0 { print $7,$10} ' access.log | sort -k2 -nr | head - 观察 502/503/504 的集中来源与时间段,辅助定位上游或网关问题。
- 若日志包含请求耗时字段(如 $request_time/$upstream_response_time),可定位慢请求:
可视化与长期化
- 快速可视化报表:GoAccess
# 终端实时 goaccess /var/log/nginx/access.log -f /var/log/nginx/access.log --log-format=COMBINED --real-time-html --ws-url=0.0.0.0:7890 # 导出 HTML 报告 goaccess /var/log/nginx/access.log -o /var/www/html/report.html --log-format=COMBINED - 集中化与可观测平台
- ELK Stack:用 Logstash 解析与清洗(GROK/JSON),写入 Elasticsearch,在 Kibana 做指标与可视化看板、告警。
- Loki + Promtail + Grafana:轻量采集与查询,适合云原生场景,Grafana 面板展示流量、错误、Top N 等。
- 运维配套
- 使用 logrotate 做日志切割,避免单文件过大影响分析效率与可用性。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 如何利用Nginx日志做内容分析
本文地址: https://pptw.com/jishu/759756.html
