温馨提示×

怎样用脚本分析nginx日志

小樊
51
2026-09-17 19:33:04
栏目: 编程语言

下面给你一个从易到难、可直接用的思路,教你怎样用脚本分析 Nginx 日志。以最常见的 Nginx 默认 access.log(combined 格式) 为例。


一、先确认日志格式

默认 Nginx access log 格式一般是:

$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"

示例:

127.0.0.1 - - [10/Oct/2024:12:00:01 +0800] "GET /index.html HTTP/1.1" 200 1024 "-" "Mozilla/5.0"

二、最常用分析需求(脚本直接能跑)

1️⃣ 统计访问量最高的 IP(Shell)

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head

2️⃣ 统计状态码分布

awk '{print $9}' access.log | sort | uniq -c | sort -nr

常见:

  • 200 正常
  • 404 页面不存在
  • 500 服务端错误

3️⃣ 统计最频繁的 URL

awk -F\" '{print $2}' access.log | awk '{print $2}' | sort | uniq -c | sort -nr | head

4️⃣ 统计浏览器(User-Agent)

awk -F\" '{print $6}' access.log | sort | uniq -c | sort -nr | head

三、用 Python 脚本做更强大分析(推荐)

示例:Python 分析 Nginx 日志

from collections import Counter
import re

log_pattern = re.compile(
    r'(?P<ip>\d+\.\d+\.\d+\.\d+) .* "(?P<method>\w+) (?P<url>.*?) HTTP.*" (?P<status>\d+)'
)

ip_counter = Counter()
url_counter = Counter()
status_counter = Counter()

with open("access.log") as f:
    for line in f:
        m = log_pattern.search(line)
        if m:
            ip_counter[m.group("ip")] += 1
            url_counter[m.group("url")] += 1
            status_counter[m.group("status")] += 1

print("Top IPs:")
for ip, count in ip_counter.most_common(5):
    print(ip, count)

print("\nTop URLs:")
for url, count in url_counter.most_common(5):
    print(url, count)

print("\nStatus Codes:")
print(status_counter)

四、进阶分析方向

✅ 性能分析

  • 响应时间(需要 log_format 加 $request_time)
  • 慢请求 TOP 10

✅ 安全分析

  • 扫描器特征(sqlmap、nmap)
  • 异常 404 暴破
  • 高频 IP 封禁

✅ 可视化

  • 用 GoAccess
goaccess access.log -o report.html --log-format=COMBINED

五、建议的日志格式(方便脚本)

log_format main '$remote_addr - $remote_user [$time_local] '
                '"$request" $status $body_bytes_sent '
                '$request_time "$http_referer" "$http_user_agent"';

如果你愿意,我可以:

  • ✅ 写 一键分析脚本
  • ✅ 按 你的日志格式定制
  • ✅ 做 安全告警脚本
  • ✅ 接 ELK / Grafana

你现在的 Nginx 日志是默认格式吗?还是已经改过?

0 踩