下面给你一个从易到难、可直接用的思路,教你怎样用脚本分析 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"
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
awk '{print $9}' access.log | sort | uniq -c | sort -nr
常见:
awk -F\" '{print $2}' access.log | awk '{print $2}' | sort | uniq -c | sort -nr | head
awk -F\" '{print $6}' access.log | sort | uniq -c | sort -nr | head
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)✅ 安全分析
✅ 可视化
GoAccessgoaccess 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"';
如果你愿意,我可以:
你现在的 Nginx 日志是默认格式吗?还是已经改过?