1. 背景與動機

在傳統的業務監控系統中,日誌往往只反映系統運行狀態,而無法映射到具體的業務行為。為了實現“從用户操作到業務鏈路”的監控,我設計了一套基於 OGNL 表達式 的規則解析引擎,使得監控邏輯可以通過配置動態生效。


2. 系統整體架構概覽

整體結構:

應用系統 → Logback 日誌擴展 → Kafka → 解析服務(OGNL引擎) → MySQL 或監控系統 → 前端 GoJS 可視化

  • 日誌採集層(Logback Appender)
  • 消息隊列層(Kafka)
  • 規則解析層(OGNL 引擎)
  • 可視化層(GoJS)

它作為日誌處理鏈路的中間層,負責從採集的原始日誌中提取、轉換、計算業務相關數據,為後續監控和可視化提供支撐。


3. 為什麼選擇 OGNL

OGNL(Object-Graph Navigation Language)是一種對象圖導航語言,常用於在 Java 中動態訪問對象屬性和方法。
與硬編碼規則不同,OGNL 允許我在配置文件中編寫表達式,實現“規則即配置”的動態解析機制。

想象你有一條用户行為日誌(例如一次下單事件):

{
  "user": {
    "id": 123,
    "region": "CN"
  },
  "order": {
    "amount": 1500,
    "status": "PAID"
  }
}

系統希望能動態配置規則,比如:

當訂單金額大於 1000 且用户來自中國時,觸發監控事件。

// 1. 業務配置中定義的表達式(可以存在數據庫或配置文件中)
String expression = "order.amount > 1000 && user.region == 'CN'";

// 2. 模擬從日誌中解析到的數據對象
Map<String, Object> logData = new HashMap<>();
logData.put("user", new User(123, "CN"));
logData.put("order", new Order(1500, "PAID"));

// 3. 初始化 OGNL 上下文
OgnlContext context = new OgnlContext();
context.setRoot(logData);

// 4. 使用 OGNL 表達式求值
boolean result = (boolean) Ognl.getValue(expression, context, logData);

// 5. 判斷是否觸發監控
if (result) {
    triggerAlert("High-value order from CN user detected!");
}

4. 核心實現思路(偽代碼級別)

// 解析流程偽代碼
1. 從日誌 JSON 中獲取行為數據對象;
2. 從配置中讀取 OGNL 表達式;
3. 使用 OgnlContext 將數據注入上下文;
4. 通過 Ognl.getValue(expression, context, data) 求值;
5. 解析結果進入監控數據管道。

5. 技術難點與解決思路

  • OGNL 表達式編譯;
  • 不同日誌結構字段不一致時的容錯處理;
  • 動態配置熱更新如何生效;
  • 安全性問題(防止表達式執行不安全方法)。

6. 成果與展望

通過引入 OGNL 動態規則解析機制,監控系統實現了日誌數據的可配置提取與計算,顯著提升了業務監控的靈活性與擴展性。未來計劃支持更復雜的表達式組合與函數註冊機制,使規則引擎更貼近領域模型。