用 Filebeat 7.17 构建可控的日志采集与风险评估流水线

在实际项目中,日志采集和风险事件处理常常面临几个痛点:

  1. 应用日志不规则:日志前缀、INFO/DEBUG 打印混杂,事件 JSON 嵌在其中;
  2. 落地文件管理困难:Filebeat 的 output.file 在 7.x 中不支持动态文件名,无法直接生成“按 5 分钟切割”的文件;
  3. 风险评估逻辑复杂:部分日志已经包含 risk_info,部分需要通过规则引擎二次评估;
  4. 最终需要报表:业务侧希望能看到周期性风险统计报表。

本文介绍一套基于 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. 实践总结

  1. Filebeat 7.17 的限制:output.file.filename 只接受固定字符串,不能用 %{+yyyy.MM.dd} 时间占位;
  2. 日志 JSON 提取:script processor 是 7.6+ 才有的能力,7.1.1 等老版本用不了;
  3. 切割策略:推荐“固定文件名 + cron 切片 + 重启 Filebeat”,最稳妥;
  4. 风险评估分层:采集端保持轻量,复杂逻辑下沉到 LiteFlow 引擎;
  5. 最终交付:报表展示风险趋势,既满足合规,也支持业务优化。

✍️ Filebeat 7.17 + cron 切割脚本 + LiteFlow 引擎 = 一条从日志采集到风险报表的完整链路。

这套方案在我们项目里已稳定运行,可以为类似的风控、合规审计场景提供参考。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容