1. 首页 > 技术教程 > 正文

AI Agent 自动分析访问日志:找出热门文章、低质量页面和异常流量

面对每天动辄几 GB 的 Nginx 访问日志,靠肉眼去 grep 关键词或者用 Excel 统计,简直是拿运维人员的命开玩笑。在主机选的实战经验里,利用 AI Agent 自动分析访问日志,不仅能秒出热门文章榜单,还能揪出那些在深夜疯狂扫描的恶意 IP。本文带你用本地大模型 + 脚本,搭建一套自动化的日志异常检测系统。

zhujixuan TASK 260

VPS 环境准备与 Docker 部署

要把日志分析交给 AI,首先得有个能跑大模型的环境。为了保证数据安全和隐私,不建议直接把日志上传到云端 API,直接在 VPS 上跑个轻量级本地模型是最稳妥的方案。这里我们用 Docker 部署 Ollama,方便管理。

安装 Docker 与 Ollama

确保你的 VPS 剩余内存至少有 4GB(跑 7B 模型),如果是 2GB 内存的小鸡,建议先加 2GB Swap,否则 Ollama 一启动就 OOM(内存溢出)。

curl -fsSL https://get.docker.com | sh
systemctl start docker
systemctl enable docker

docker run -d -v ollama:/root/.ollama -p 127.0.0.1:11434:11434 –name ollama ollama/ollama

本地大模型选择与日志预处理

模型选得好,分析没烦恼。对于日志分析这种“文本理解 + 逻辑归纳”的任务,不需要特别强的数学推理能力,Qwen2.5 或 Llama 3 的 7B 版本完全够用,速度快且显存占用低。

选择适合 VPS 的模型版本

进入 Ollama 容器拉取模型。这里推荐 `qwen2.5:7b`,它在中文理解和代码分析上表现不错。

docker exec -it ollama ollama pull qwen2.5:7b

docker exec -it ollama ollama run qwen2.5:7b "你好"

编写 Python 脚本清洗日志

原始 Nginx 日志包含大量静态资源请求(图片、CSS、JS),这些噪音会浪费 Token。写个 Python 脚本先把它们过滤掉,只保留核心的业务请求和异常状态码。

python
import re

log_pattern = re.compile(r'(?P<ip>\d+\.\d+\.\d+\.\d+) – – \[(?P<time>.*?)\] "(?P<method>\w+) (?P<path>.*?) .*?" (?P<status>\d+) .*?" (?P<ua>.*?)"')

def parse_log(log_file):
data = []
with open(log_file, 'r', encoding='utf-8', errors='ignore') as f:
for line in f:
if any(ext in line for ext in ['.jpg', '.css', '.js', '.png', '.woff', '.ico']):
continue
match = log_pattern.search(line)
if match:
status = int(match.group('status'))
if status == 200 or status >= 400:
data.append({
'ip': match.group('ip'),
'path': match.group('path'),
'status': status,
'ua': match.group('ua')
})
return data

AI Agent 核心逻辑与 Prompt 工程

这一步是灵魂。我们要构造 Prompt,让 AI Agent 充当“运维专家”。不要把几万条日志一股脑扔给模型,那样既慢又贵。先做简单的聚合统计,再把统计结果丢给 AI 分析。

识别热门文章与低质量页面

我们需要把处理后的日志数据转换成 AI 能读懂的文本格式(JSON 或 Markdown),然后调用 Ollama API。

python
import requests
import json

def analyze_logs_with_ai(log_data):
from collections import Counter
top_urls = Counter(item['path'] for item in log_data if item['status'] == 200).most_common(10)
top_404s = Counter(item['path'] for item in log_data if item['status'] == 404).most_common(10)
top_ips = Counter(item['ip'] for item in log_data).most_common(5)

prompt = f"""
你是一个资深网站运维专家。请根据以下访问日志统计数据,写出一份分析报告。

1. 热门文章 Top 10: {top_urls}
2. 404 错误最多的页面 Top 10: {top_404s}
3. 访问频次最高的 IP Top 5: {top_ips}

请分析:
– 哪些文章是目前最受用户欢迎的?
– 404 页面是否存在明显的错误链接或被恶意扫描的痕迹?
– 高频 IP 是否存在异常(如果是单一 IP 访问量极高,可能是爬虫或攻击)?

输出格式要求简洁,直接给出结论和建议。
"""

response = requests.post('http://127.0.0.1:11434/api/generate', json={
'model': 'qwen2.5:7b',
'prompt': prompt,
'stream': False
})
return response.json()['response']

异常流量检测与安全威胁分析

AI Agent 的强项是识别模式。比如,如果某个 IP 在 1 分钟内请求了 50 次 `/wp-login.php`,或者在 UA 里写着 `sqlmap`,人类看一眼就知道是攻击,AI 也能看出来。

在 Prompt 中加入安全上下文:
text
如果发现 User-Agent 包含 "bot", "spider", "scan", "sqlmap" 等字样,或者 IP 对单一接口进行高频访问,请标记为“潜在安全威胁”。

定时任务与结果通知

脚本写好了,总不能天天手动敲。用 Crontab 每天早上跑一次,把 AI 生成的分析报告发到你的邮箱或者 Telegram。

apt install cronie

crontab -e

0 8 * * * /usr/bin/python3 /root/log_agent.py > /var/log/log_analysis_report.txt 2>&1

如果需要通知,可以在 Python 脚本里接入 `requests` 库,调用 Telegram Bot API 或者企业微信 Webhook,把分析结果直接推送到手机。

老鸟叮嘱

1.别让 Ollama 裸奔:Ollama 默认的 11434 端口绝对不能开在公网,否则你的 VPS 就会变成别人的免费算力矿机,甚至被植入恶意模型。Docker 运行时务必绑定 `127.0.0.1`。
2.Token 是钱:虽然本地模型不按 Token 计费,但上下文长度有限。不要把一天的原始日志全丢进去,一定要做预处理和聚合,只把“统计结果”喂给 AI。
3.Swap 很关键:小内存 VPS 跑大模型,Swap 是保命符。如果脚本跑着跑着被 Kill,检查一下是不是 OOM 了。
4.日志轮转:分析完记得清理或压缩旧日志,别让磁盘空间占满。

FAQ

Q1:我的 VPS 只有 1G 内存,能跑这个方案吗?
A:非常勉强。建议使用量化程度更高的模型(如 `qwen2.5:3b` 或者 `gemma2:2b`),并且必须配置至少 2G 的 Swap 虚拟内存,否则模型加载阶段就会崩溃。

Q2:AI 分析的结果准确吗?
A:对于明显的异常(如 SQL 注入特征、高频 404),本地 7B 模型的识别率很高。但对于复杂的业务逻辑判断(如“用户跳出率高”),可能需要你微调 Prompt 或多次验证。

Q3:可以分析 Apache 的日志吗?
A:可以,原理一样。你只需要修改 Python 脚本中的正则表达式(`log_pattern`),使其匹配 Apache 的 `LogFormat` 格式即可。

Q4:除了 Ollama,还能用别的工具吗?
A:如果你不想自己写 Python 脚本,也可以尝试 `Open WebUI` 连接本地模型,它支持上传文件进行分析,但在自动化批量处理上不如脚本灵活。

这套方案把原本需要半小时的人工排查,压缩到了几分钟内完成,而且还能给出人性化的建议。运维工作不仅要“稳”,还要“懒”,把重复劳动交给 AI Agent,这才是技术人该有的追求。

转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/10229.html 商家投稿邮箱:zhujixuanblog@qq.com