Graylog 的告警通知預設的主旨長這樣:Graylog event notification: Proxmox VE 登入失敗。收件者看到只知道「有事」,要點開信才知道是哪台主機、哪個帳號。告警一多,光看主旨根本分不出輕重。
其實通知的主旨與內容都可以用變數,把事件來源的訊息欄位(主機、帳號、來源 IP)直接放進去。這篇整理可用的變數、backlog 的用法,以及另一個更穩定的做法:事件定義的自訂欄位。
模板語法
Graylog 的通知模板使用 JMTE(Java Minimal Template Engine)語法,變數寫成 ${...}:
| 語法 | 用途 |
|---|---|
${變數} | 輸出變數 |
${if 變數}...${end} | 變數有值才輸出 |
${foreach 清單 項目}...${end} | 逐一輸出清單裡的每一項 |
可用的變數
| 變數 | 內容 |
|---|---|
${event_definition_title} | 事件定義的標題 |
${event_definition_description} | 事件定義的說明 |
${event_definition_type} | 事件定義的類型 |
${event.message} | 事件訊息 |
${event.source} | 事件來源(產生事件的 Graylog 節點) |
${event.timestamp} | 事件時間 |
${event.timerange_start}、${event.timerange_end} | 搜尋的時間範圍 |
${event.priority} | 優先等級 |
${event.key} | 事件的 key(有設定 group by 時) |
${event.fields.欄位} | 事件定義的自訂欄位 |
${backlog} | 觸發事件的原始訊息清單 |
注意 ${event.source} 是產生事件的 Graylog 節點,不是原始記錄的來源主機。要拿到原始記錄的內容,要從 backlog 取。
用 backlog 取原始訊息的欄位
先開啟 Message Backlog
在通知設定裡,或事件定義的「Notifications」步驟中,把 Message Backlog 設成大於 0(例如 1)。設成 0 的話 backlog 是空的,後面的變數都不會有內容。
取欄位的寫法
backlog 裡每一筆訊息可以用:
| 寫法 | 內容 |
|---|---|
${message.source} | 訊息的 source 欄位 |
${message.message} | 訊息內容 |
${message.timestamp} | 訊息時間 |
${message.fields.欄位} | 任意欄位,例如 ${message.fields.src_ip} |
要用 foreach 包起來:
${event_definition_title} - ${foreach backlog message}${message.source}${end}
實例:Wazuh 轉進來的登入失敗告警
以 Wazuh 送進 Graylog 的 Proxmox VE 登入失敗記錄為例,訊息裡有這些欄位:
source=wazuh-manager
agent_name=pve1
data_dstuser=root
data_srcip=192.168.1.200
rule_description=Proxmox VE authentication failed.
想在主旨顯示「哪台主機、哪個帳號、從哪裡來」:
${event_definition_title}${foreach backlog message} - 主機: ${message.fields.agent_name} - 帳號: ${message.fields.data_dstuser} - 來源: ${message.fields.data_srcip}${end}
收到的主旨會變成:
PVE 登入失敗 - 主機: pve1 - 帳號: root - 來源: 192.168.1.200
欄位可能不存在時,用 if 包起來,沒有值就不輸出那一段:
${event_definition_title}${foreach backlog message}${if message.fields.user} - User: ${message.fields.user}${end} - Source: ${message.source}${end}
backlog 筆數的影響
| 設定 | 結果 |
|---|---|
0 | backlog 是空的,主旨不會有任何欄位內容 |
1 | 只有一筆,主旨最乾淨 |
| 大於 1 | foreach 會把每一筆都輸出,主旨會變得很長 |
用在主旨時建議設 1;信件內容可以設多一點,列出觸發這個事件的多筆記錄。
另一種做法:事件定義的自訂欄位
backlog 的寫法有個缺點:每個通知都要寫一長串 foreach。如果某個欄位每次都要用,可以在事件定義裡先把它變成事件的欄位。
在事件定義的「Fields」步驟新增自訂欄位,例如:
| 項目 | 設定 |
|---|---|
| Name | source_module |
| Set Value From | Template |
| Template | ${source.SourceModuleName} |
${source.欄位} 會取觸發事件的訊息裡的欄位值(以 NXLog 送來的 SourceModuleName 為例)。之後在通知裡直接用:
nxlog - ${event.fields.source_module}
注意:自訂欄位只會取觸發事件的第一筆訊息的值。一個事件包含多筆訊息時,其他訊息的值不會出現,這是設計上的行為;需要列出全部,還是要用 backlog。
自訂欄位的好處是:值會存在事件本身,在 Graylog 的告警頁面也看得到、可以搜尋,不只用在通知裡。
測試
通知設定頁有「Execute Test Notification」,但測試通知用的是範例資料,不會有真正的 backlog 訊息,欄位多半是空的。比較準的測試方式是:
- 把事件定義的搜尋時間範圍與條件放寬,讓它很快被觸發
- 確認收到的通知主旨與內容正確
- 再把條件改回來
結論
告警主旨放進主機、帳號、來源 IP 這些資訊,收件者一眼就能判斷要不要馬上處理。做法有兩種:通知裡用 ${foreach backlog message}...${end} 取原始訊息欄位(記得 Message Backlog 要大於 0),或是在事件定義先建自訂欄位,通知裡直接用 ${event.fields.欄位}。
參考資料
- Graylog 文件:Alerts(Metadata Available to Alerts)
https://go2docs.graylog.org/current/interacting_with_your_log_data/alerts.html - Graylog 文件:Event Definitions
https://go2docs.graylog.org/current/interacting_with_your_log_data/event_definitions.html - JMTE:Java Minimal Template Engine
https://github.com/DJCordhose/jmte - Graylog Community:Add the event source to the subject of an email notification
https://community.graylog.org/t/add-the-event-source-to-the-subject-of-an-email-notification/12972



