在實際項目中,日志采集和風險事件處理常常面臨幾個痛點:
- 應(yīng)用日志不規(guī)則:日志前綴、INFO/DEBUG 打印混雜,事件 JSON 嵌在其中;
- 落地文件管理困難:Filebeat 的 output.file 在 7.x 中不支持動態(tài)文件名,無法直接生成“按 5 分鐘切割”的文件;
- 風險評估邏輯復雜:部分日志已經(jīng)包含 risk_info,部分需要通過規(guī)則引擎二次評估;
- 最終需要報表:業(yè)務(wù)側(cè)希望能看到周期性風險統(tǒng)計報表。
本文介紹一套基于 Filebeat 7.17 + 定時切割腳本 + LiteFlow 引擎 的端到端解決方案。
1. 整體架構(gòu)
系統(tǒng)分為 客戶端日志采集 和 服務(wù)器端處理 兩大環(huán)節(jié):
- 客戶端
- 定時器觸發(fā)采集器,從應(yīng)用日志提取 JSON 事件;
- Filebeat 7.17 監(jiān)控緩存文件,寫入到 NAS(統(tǒng)一是 payment.ndjson);
- Cron 定時器每 5 分鐘調(diào)用腳本,將文件重命名為 payment-YYYY.MM.DD-HHMM.ndjson,并重啟 Filebeat 繼續(xù)寫新文件。
- 服務(wù)器端
定時器觸發(fā)目錄掃描器,讀取新切片文件;
對事件進行批量處理:
- 已含 risk_info → 直接落庫并更新統(tǒng)計;
- 未含 risk_info → 調(diào)用 LiteFlow 風險評估引擎,按規(guī)則鏈生成結(jié)果再入庫;
標記文件已處理;
報表模塊定時從數(shù)據(jù)庫匯總風險統(tǒng)計,生成報表。
用時序圖表示如下:

image.png
2. Filebeat 7.17 配置要點
2.1 使用
script processor
截取 JSON
在 Filebeat 7.17 中,我們利用 JavaScript 腳本處理器 實現(xiàn)花括號配對,準確截取日志里的 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
最終輸出結(jié)構(gòu)為:
{
"@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 不支持動態(tài)文件名,我們采用外部腳本切割:
#!/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 并更新統(tǒng)計;
- 沒有 risk_info:調(diào)用 LiteFlow 規(guī)則鏈,得到風險結(jié)果,再寫 DB;
- DB 端有定時統(tǒng)計任務(wù),報表模塊從中取數(shù)生成可視化。
5. 實踐總結(jié)
- Filebeat 7.17 的限制:output.file.filename 只接受固定字符串,不能用 %{+yyyy.MM.dd} 時間占位;
- 日志 JSON 提取:script processor 是 7.6+ 才有的能力,7.1.1 等老版本用不了;
- 切割策略:推薦“固定文件名 + cron 切片 + 重啟 Filebeat”,最穩(wěn)妥;
- 風險評估分層:采集端保持輕量,復雜邏輯下沉到 LiteFlow 引擎;
- 最終交付:報表展示風險趨勢,既滿足合規(guī),也支持業(yè)務(wù)優(yōu)化。
?? Filebeat 7.17 + cron 切割腳本 + LiteFlow 引擎 = 一條從日志采集到風險報表的完整鏈路。
這套方案在我們項目里已穩(wěn)定運行,可以為類似的風控、合規(guī)審計場景提供參考。