夜鷹(Nightingale)ES 日誌告警規則

ES 日誌告警可以通過對日誌進行查詢分析,來及時發現異常日誌,並觸發告警。
首先可以選擇ES數據源,然後配置查詢條件和告警條件,下面針對每個數字指向的功能,進行詳細說明
1 選擇索引
支持多種配置方式
- 指定單個索引 gb 在 gb 索引中搜索所有的文檔
- 指定多個索引 gb,us 在 gb 和 us 索引中搜索所有的文檔
- 指定索引前綴 g*,u* 在任何以 g 或者 u 開頭的索引中搜索所有的文檔
2 設置過濾條件
目前支持的是 query string 語法(Lucene 語法)
基礎查詢語法
| 語法 | 說明 | 示例 |
|---|---|---|
字段:值 |
查詢字段包含指定值的記錄 | status:active |
字段:(值1 OR 值2) |
查詢字段包含任意一個值的記錄 | title:(quick OR brown) |
字段:"完整短語" |
查詢字段包含完整短語的記錄(不分詞) | author:"John Smith" |
關於分詞的重要說明
Elasticsearch 對 text 類型字段會進行分詞處理,這是最容易踩坑的地方:
什麼是分詞?
- 當字段類型為
text時,ES 會將內容拆分成多個詞(token)建立索引 - 中文分詞器會將「連接超時」拆分為「連接」、「超時」等詞
- 英文會按空格和標點拆分,「John Smith」會拆分為「john」和「smith」
分詞對查詢的影響:
| 查詢方式 | 行為 | 是否會被分詞 |
|---|---|---|
message:連接超時 |
查詢詞也會被分詞,默認 OR 邏輯匹配 | ✅ 會分詞 |
message:"連接超時" |
短語查詢,要求完整短語按順序出現 | ❌ 不分詞 |
message.keyword:連接超時 |
使用 keyword 子字段,精確匹配 | ❌ 不分詞 |
常見問題:查詢結果中沒有搜索的關鍵字
如果你搜索 message:連接超時,但返回的日誌中並沒有「連接超時」這個詞,原因是:
- 查詢詞「連接超時」被分詞成了「連接」、「超時」
- ES 默認使用 OR 邏輯,只要文檔包含其中任意一個詞就會返回
- 所以只包含「連接」或「超時」的日誌也會被查詢出來
解決方案:
# 方案1:使用引號進行短語查詢(推薦)
message:"連接超時"
# 方案2:使用 AND 強制所有詞都必須存在
message:(連接 AND 超時)
# 方案3:使用 keyword 子字段精確匹配(需索引支持)
message.keyword:*連接超時*
支持使用 ? 和 * 通配符:
- qu?ck - ? 匹配單個字符
- bro* - * 匹配零個或多個字符
使用 ~ 運算符進行模糊匹配:
- quikc~ - 匹配與 quick 相似的詞
- “fox quick”~5 - 短語查詢中的詞之間可以相隔最多5個位置
支持數值和日期範圍:
- count:[1 TO 5] - 閉區間,包含1和5
- date:[2022-01-01 TO 2022-12-31]
- age:>=10 - 大於等於10
可以使用 AND、OR、NOT 等布爾操作符:
- quick AND brown - 同時包含兩個詞
- quick OR brown - 包含其中任意一個詞
- quick NOT fox - 包含 quick 但不包含 fox
詳細的語法可以參考 ES 文檔
3 設置日期字段
點擊可以選擇日誌中的日期字段,通過此字段來作為查詢日誌的時間範圍的依據
4 設置查詢日誌的時間範圍
如果是 5 分鐘,表示在做告警查詢時,會查詢過去 5 分鐘內的日誌
5 數值提取
對日誌進行統計分析的函數,比如 count、sum、avg、min、max 等
6 Group By
對日誌進行分組,比如按照 host 字段進行分組,進行 count 統計, 查詢到的結果會按照 host 字段進行分組
7 告警條件
統計分析得到的數值,會賦值給告警條件中的 A、B、C 等變量,然後根據這些變量進行告警條件判斷,比如 $A > 10 表示日誌數量大於10條時觸發告警
8 高級配置
在有的場景,日誌會出現延遲,如果延遲3分鐘,查詢最近3分鐘的數據,會查不到數據,這時,可以在高級配置中,設置延遲查詢時間,比如延遲180s,表示查詢查詢的時候,把開始時間和終止時間都向前偏移180s
使用範例
示例1:錯誤日誌監控
- 索引:app-logs-*
- 查詢條件:level:ERROR AND service:payment
- 時間範圍:5分鐘
- 數值提取:count()
- 告警條件:$A > 10 說明:監控支付服務在5分鐘內的錯誤日誌數量是否超過10條
示例2:接口響應時間監控
- 索引:nginx-access-*
- 查詢條件:path:"/api/v1/order*" AND response_time:>500
- 時間範圍:10分鐘
- 數值提取:avg(response_time)
- Group By:path
- 告警條件:$A > 1000 說明:監控訂單相關接口的平均響應時間是否超過1秒
示例3:異常狀態碼監控
- 索引:nginx-*
- 查詢條件:status:[500 TO 599]
- 時間範圍:15分鐘
- 數值提取:count()
- Group By:host, status
- 告警條件:$A > 50 說明:按主機和狀態碼分組統計5xx錯誤,如果某台主機的某個狀態碼出現次數超過50次則告警
示例4:業務異常關鍵字監控
- 索引:business-logs-*
- 查詢條件:message:(“timeout” OR “connection refused” OR “out of memory”)
- 時間範圍:30分鐘
- 數值提取:count()
- 告警條件:$A > 5 說明:監控包含特定錯誤關鍵字的日誌數量