在实际项目中,日志采集和风险事件处理常常面临几个痛点:
- 应用日志不规则:日志前缀、INFO/DEBUG 打印混杂,事件 JSON 嵌在其中;
- 落地文件管理困难:Filebeat 的 output.file 在 7.x 中不支持动态文件名,无法直接生成“按 5 分钟切割”的文件;
- 风险评估逻辑复杂:部分日志已经包含 risk_info,部分需要通过规则引擎二次评估;
- 最终需要报表:业务侧希望能看到周期性风险统计报表。
本文介绍一套基于 Filebeat 7.17 + 定时切割脚本 + LiteFlow 引擎 的端到端解决方案。
1. 整体架构
系统分为 客户端日志采集 和 服务器端处理 两大环节:
- 客户端
- 定时器触发采集器,从应用日志提取 JSON 事件;
- Filebeat 7.17 监控缓存文件,写入到 NAS(统一是 payment.ndjson);
- Cron 定时器每 5 分钟调用脚本,将文件重命名为 payment-YYYY.MM.DD-HHMM.ndjson,并重启 Filebeat 继续写新文件。
- 服务器端
定时器触发目录扫描器,读取新切片文件;
对事件进行批量处理:
- 已含 risk_info → 直接落库并更新统计;
- 未含 risk_info → 调用 LiteFlow 风险评估引擎,按规则链生成结果再入库;
标记文件已处理;
报表模块定时从数据库汇总风险统计,生成报表。
用时序图表示如下:
image.png
2. Filebeat 7.17 配置要点
2.1 使用
script processor
截取 JSON
在 Filebeat 7.17 中,我们利用 JavaScript 脚本处理器 实现花括号配对,准确截取日志里的 JSON:
- script:
lang: javascript
id: extract_json_block
source: >
function process(event) {
var msg = event.Get("message");
if (!msg) return;
var start = msg.indexOf("{");
var end = msg.lastIndexOf("}");
if (start >= 0 && end > start) {
event.Put("raw_json", msg.substring(start, end+1));
} else {
event.Put("parse_error_no_json", true);
}
}
2.2 解析 JSON 到
data
容器
- decode_json_fields:
fields: ["raw_json"]
target: "data"
overwrite_keys: true
最终输出结构为:
{
"@timestamp": "...",
"data": { "common": {...}, "events": [...] },
"labels": { "app": "PAYMENT", "stream": "PAY_002", "flow": "PAYMENT_FLOW", "host": "ocs-app-t4" }
}
3. 文件切割:cron + shell 脚本
由于 Filebeat 7.17 的 output.file 不支持动态文件名,我们采用外部脚本切割:
#!/usr/bin/env bash
DIR="/mnt/nas/logs/filebeat"
SRC="${DIR}/payment.ndjson"
TS="$(date +%Y.%m.%d-%H%M)"
DST="${DIR}/payment-${TS}.ndjson"
if [ -f "$SRC" ]; then
mv "$SRC" "$DST"
: > "$SRC"
/usr/local/bin/fb-stop.sh || true
/usr/local/bin/fb-start.sh
fi
配合 crontab:
*/5 * * * * /usr/local/bin/fb-rotate-5min.sh >> /var/log/fb-rotate.log 2>&1
4. 风险事件处理逻辑
- 已有 risk_info:直接写 DB 并更新统计;
- 没有 risk_info:调用 LiteFlow 规则链,得到风险结果,再写 DB;
- DB 端有定时统计任务,报表模块从中取数生成可视化。
5. 实践总结
- Filebeat 7.17 的限制:output.file.filename 只接受固定字符串,不能用 %{+yyyy.MM.dd} 时间占位;
- 日志 JSON 提取:script processor 是 7.6+ 才有的能力,7.1.1 等老版本用不了;
- 切割策略:推荐“固定文件名 + cron 切片 + 重启 Filebeat”,最稳妥;
- 风险评估分层:采集端保持轻量,复杂逻辑下沉到 LiteFlow 引擎;
- 最终交付:报表展示风险趋势,既满足合规,也支持业务优化。
✍️ Filebeat 7.17 + cron 切割脚本 + LiteFlow 引擎 = 一条从日志采集到风险报表的完整链路。
这套方案在我们项目里已稳定运行,可以为类似的风控、合规审计场景提供参考。