如何將 Windows Event Logs 推送到 Grafana Loki

Ivan Cheng
12 min readJan 16, 2023

上一篇已經教大家如何在 Ubuntu 22.04 安裝 Loki,今天就來談談如何透過 Promtail 日誌收集器將Windows Event Logs 推送到 Loki 並於 Grafana 進行可視化的展現吧。

我們可以把 Promtail 視為一種代理程式,負責傳送本地端的日誌到私有的 Loki 或者是 Grafana Cloud,並安裝在想要監控的應用程式的機器中。

主要負責的工作:

  • 發現目標,即日誌來源或者檔案
  • 將標籤附加到日誌串流
  • 將它們推送到 Loki 實例

安裝 Promtail

從 Loki 存儲庫下載最新的發行版本

https://github.com/grafana/loki/releases/download/v2.7.1/promtail-windows-amd64.exe.zip

將其解壓縮後放到想要的位置,我們以 C:\promtail 作為範例

在 C:\promtail 目錄底下新增 promtail-local-config.yaml 文件

我們透過 windows_events 區塊告訴 Promtail 如何抓取 Windows Event Logs 並將傳送它們到 Loki。

server:
http_listen_port: 9080
grpc_listen_port: 0

positions:
filename: "./positions.yaml"

clients:
- url: http://your_loki_ip:3100/loki/api/v1/push

scrape_configs:
- job_name: windows
windows_events:
use_incoming_timestamp: false
bookmark_path: "./bookmark.xml"
eventlog_name: "Application"
xpath_query: '*'
labels:
job: windows
relabel_configs:
- source_labels: ['computer']
target_label: 'host'

書籤路徑 bookmark_path 負責記錄最後處理的事件,當 Promtail 重新啟動時需要它,以允許它從中斷的地方繼續讀取日誌。

<BookmarkList>
<Bookmark Channel='Application' RecordId='23520' IsCurrent='true'/>
</BookmarkList>

啟動服務

以系統管理員權限開啟命令提示字元,輸入下列指令啟動 Promtail。

cd C:\promtail
.\promtail-windows-amd64.exe --config.file=promtail-local-config.yaml

這樣便成功啟動 Promtail 並開始傳送 Application 事件紀錄到 Loki

此時回到 Grfana 使用 Loki 做為資料來源,透過 Explore 便可以看到推送過來的紀錄了。

點選 channel 與 job 標籤的屬性當作查詢條件,點選 Show Logs。

如果需要,您可以通過 Relabeling 重新標記預設的標籤。

如上面的範例我們將預設的 computer 標籤重新標記成 host

當 Promtail 接收到一個事件時,它將附加 channel 和 computer 標籤,並將事件序列化成 JSON 格式。

註冊服務

接下來要將剛剛的指令註冊成服務,讓它每次開機自動執行。

我們透過 nssm 安裝並啟動 Windows 服務

Windows 內建的註冊 Windows 服務的工具 sc.exe 跟 New-Service 註冊服務後都無法正常運行。

下載並將 nssm.exe 解壓縮到 C:\promtail 底下

https://nssm.cc/release/nssm-2.24.zip

開啟命令提示字元,輸入下列指令

cd C:\promtail
nssm install "Promtail Agent"

Application Path 選擇 C:\promtail\promtail-windows-amd64.exe

Application Arguments 輸入 --config.file=promtail-local-config.yaml

最後按下 Install Servcie 即可註冊成 Windows 服務

需要注意的是可執行檔所在路徑為 C:\promtail\nssm.exe,如果 nssm.exe 被移動到其他位置服務將無法啟動。

或者請將 nssm.exe 擺在一個確定不會異動或刪除的路徑

Promtail Pipeline 日誌處理

各位看官應該有注意到使用官方提供的 Scrape Configs 實在太過陽春,所以接下來我們要介紹 Promtail Pipeline 日誌處理,Pipeline 用於轉換單行日誌、標籤與時間戳。

Pipeline 至少由一個 Stages 階段組成,而階段有 4 種類型:

  • 解析階段:解析當前日誌行並從中提取數據,然後提取的數據可供其他階段使用。
  • 轉換階段:換從先前階段提取的數據
  • 動作階段:從前面的階段提取數據並用它們做一些事情,例如添加現有標籤或修改到日誌行。
  • 過濾階段:可以根據某些條件選擇性地刪除資料

修改 promtail-local-config.yaml 文件,內容如下。

server:
http_listen_port: 9080
grpc_listen_port: 0

positions:
filename: "./positions.yaml"

clients:
- url: http://your_loki_ip:3100/loki/api/v1/push

scrape_configs:
- job_name: windows
windows_events:
eventlog_name: "Application"
use_incoming_timestamp: true
xpath_query: '*'
bookmark_path: "./bookmark-application.xml"
exclude_event_data: true
exclude_user_data: true
labels:
logsource: windows-eventlog
pipeline_stages:
- json:
expressions:
source: source
eventID: event_id
level: levelText
- labels:
source:
eventID:
level:
- job_name: windows
windows_events:
eventlog_name: "System"
use_incoming_timestamp: true
xpath_query: '*'
bookmark_path: "./bookmark-system.xml"
exclude_event_data: true
exclude_user_data: true
labels:
logsource: windows-eventlog
pipeline_stages:
- json:
expressions:
source: source
eventID: event_id
level: levelText
- labels:
source:
eventID:
level:

這邊我們多新增一個 Job 來推送系統日誌並使用了兩個階段來處理日誌

  • 轉換階段:使用 JOSN 剖析 Source、Event ID 與 Level 欄位
  • 動作階段:將剖析到的欄位分別貼上對應的標籤

再回到 Grfana 的 Explore 可以看到推送過來的日誌多了許多標籤可以讓我們進行過濾條件。

雖然 Explore 非常適合系統管理人員快速進行操作,但對於初次使用的用戶或在半夜收到告警的人來說,它也可能有點令人生畏。

下一篇我們將教大家如何擁有自己的儀表板,除了實作 Explore 的現有的功能,還可以簡單地透過預先設置的標籤進行搜索,以幫助一些團隊在故障排除時快速找到他們正在尋找的東西。

參考文件

--

--