Ubuntu环境下基于JS日志的异常流量检测
一 日志采集与结构化
npm install winstonconst winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
// 请求日志示例(在中间件中)
app.use((req, res, next) => {
logger.info('http_request', {
ts: new Date().toISOString(),
ip: req.ip,
method: req.method,
url: req.url,
ua: req.headers['user-agent'],
status: res.statusCode,
rt: Date.now() - req.startTime
});
next();
});
pm2 logs <app> 实时查看与采集;如需集中化,可将日志接入 ELK(Elasticsearch/Logstash/Kibana) 或 Graylog 等平台进行检索与可视化。二 命令行快速检测
tail -f /path/to/combined.logtail -f /path/to/combined.log | grep 'error'tail -n 10000 /path/to/combined.log | jq -r '.["ts"]' | cut -d'T' -f2 | cut -d'.' -f1 | sort | uniq -ctail -n 50000 /path/to/combined.log | jq -r '.["ip"]' | sort | uniq -c | sort -nr | head -20tail -n 50000 /path/to/combined.log | jq -r '.["url"]' | sort | uniq -c | sort -nr | head -20tail -n 10000 /path/to/combined.log | jq 'select(.["status"] >= 500)' | wc -l 与总量对比计算比例awk/grep/sed 按字段位置解析。若日志量大,建议先采样或接入 Logstash/Fluentd 做预处理。三 模式与阈值示例
| 异常信号 | 日志侧特征 | 建议阈值示例 | 处置要点 |
|---|---|---|---|
| 流量突发 | 单位时间请求数骤增 | 1 分钟请求数 > 基线 3σ 或 > 1000 req/min | 触发限流/封禁,联动告警 |
| 单 IP 高频 | 同一 IP 短时间大量请求 | 1 分钟 > 100 req/min 或 10 分钟 > 500 req | 自动封禁该 IP,观察是否回落 |
| 异常路径扫爆 | 少数路径命中异常高 | 某路径占比 > 70% 且总量异常 | 临时禁用路由或返回 429 |
| 错误率飙升 | 5xx/4xx 比例异常 | 5xx > 5% 或 4xx+5xx > 10% | 回滚版本/限流/扩容 |
| 响应时间异常 | P95/P99 明显上升 | P95 > 2s 或较基线翻倍 | 降级非核心功能、排查慢查询 |
| 地理异常 | 突发来自异常地区 | 某地区请求占比突增 | 结合风控策略限制或二次校验 |
四 实时告警与防护联动