Fluentd 作為開源日誌收集器,需要搭配不同工具和服務才能發揮最大效用。本文將介紹 Redis、Python 和 Vault 的安裝與設定,並說明如何在 Fluentd 中使用相對時間和日期時間表示法。此外,也將涵蓋資料大小表示法、正規表示式,以及 Docker 標籤自定義的應用。Fluentd 提供豐富的外掛生態,本文將介紹格式化、過濾、標籤操作等外掛,以及如何利用外掛預防警示風暴、進行日誌分析和指標監控。最後,將概述 Fluentd 的外掛開發介面,協助開發者擴充套件 Fluentd 功能,開發更符合自身需求的日誌處理方案。
安裝額外工具和服務
在進行 Fluentd 相關操作時,我們可能需要安裝額外的工具和服務。以下將詳細介紹這些工具的安裝步驟。
Redis 的安裝與設定
Redis 是一種高效能的鍵值資料函式庫,能夠支援多種資料結構,如字串、雜湊、列表、集合等。首先,我們需要下載並安裝 Redis。Redis 提供了 Docker 映像檔,使用者可以直接下載並執行。
Redis 伺服器的安裝
- 下載 Redis Docker 映像檔:使用者可以直接從 Docker Hub 下載 Redis 的官方映像檔。
- 執行 Redis 容器:下載完成後,使用者可以透過 Docker 命令執行 Redis 容器。
- 使用 Redis CLI:如果使用 Docker 映像檔,可能需要使用 Redis CLI 進行操作。使用者需要確保 Redis CLI 已正確安裝並設定。
除了使用 Docker 外,使用者也可以直接下載 Redis 的二進位檔案進行安裝。安裝完成後,需要將 Redis 的二進位檔案路徑新增至系統的 PATH 環境變數中。
Redis Gem 的安裝
在 Ruby 環境中使用 Redis,需要安裝 Redis Gem。使用者可以透過以下命令安裝:
gem install redis
此命令將下載並安裝最新版本的 Redis Gem。更多關於 Redis Gem 的資訊,請參考官方檔案:https://github.com/redis/redis-rb。
Python 的安裝與設定
在第 11 章中,我們使用 Python 來示範預設介面卡的使用方法。Python 的安裝方式取決於作業系統。Windows 使用者可以從 Python 官方網站下載 MSI 安裝檔,而 Linux 使用者則可以使用套件管理器進行安裝。
Python 版本的選擇
目前仍有許多人使用 Python 2.x,但 Python 2.x 已經到達其生命週期終點。我們建議使用 Python 3.x。在 Windows 上,可以使用 Python Switcher 公用程式來切換不同版本的 Python。在 Linux 上,可以使用 Alternatives 功能來管理不同版本的 Python。
安裝必要的 Python 函式庫
安裝完成 Python 後,需要安裝兩個額外的函式庫:pyyaml 和 fluent-logger。使用者可以透過 PIP(Python 的套件安裝工具)進行安裝:
pip install pyyaml
pip install fluent-logger
根據個人喜好,使用者可能還需要安裝或新增外掛至 IDE,以便更方便地處理 Python 和 YAML 檔案。
Vault 的安裝與設定
HashiCorp 的 Vault 是一種用於管理秘密資訊的工具。在書中,我們提到了 Vault 的使用方法。雖然不是必要的,但使用者可以嘗試將 Vault 與 Fluentd 一起使用。HashiCorp 提供了詳細的 Vault 安裝。
Vault 的安裝步驟
- 下載 Vault 二進位檔案:從官方網站下載適合您作業系統的 Vault 二進位檔案。
- 解壓縮 Vault:將下載的 zip 檔案解壓縮至適當的位置。
- 設定 PATH 環境變數:將 Vault 的安裝路徑新增至系統的 PATH 環境變數中。
- 安裝自動完成工具:執行
vault -install-autocomplete命令以新增命令列自動完成工具。 - 啟動 Vault 伺服器:以開發模式啟動 Vault 伺服器,使用命令
vault server -dev。啟動時,Vault 將顯示一個金鑰和令牌,使用者需要記錄這些資訊。 - 設定環境變數:設定兩個環境變數:
VAULT_ADDR和VAULT_TOKEN。
使用者可以透過 vault status 命令驗證 Vault 的設定狀態。需要注意的是,每次重新啟動 Vault 時,令牌都會改變,並且儲存的秘密資訊將被清空。這是因為 Vault 在開發模式下運作,非持久化儲存。
相對時間的表示方法
在 Fluentd 的某些設定屬性中,需要使用相對時間表示法。相對時間可以使用簡單的整數和時間單位(如秒、分、時)來表示。下表列出了 Fluentd 中相對時間的表示方法:
| 時間單位 | 字元表示 | 範例 |
|---|---|---|
| 秒 | s | 10s 表示 10 秒,0.1s 表示 100 毫秒 |
| 分 | m | 1m 表示 1 分鐘,0.25m 表示 15 秒 |
| 時 | h | 24h 表示 24 小時,0.25h 表示 15 分鐘 |
| 天 | d | 1d 表示 1 天,0.5d 表示 12 小時 |
相對時間表示法的應用
在 Fluentd 設定中,正確使用相對時間表示法對於組態輸入和輸出外掛至關重要。例如,在設定日誌輪替或緩衝區逾時時,可以使用相對時間來指定間隔。
日期和時間的表示方法
Fluentd 中的日期和時間表示法是根據 Ruby 的日期時間解析功能。下表列出了日期和時間表示法中使用的字元程式碼及其對應的值:
| 字元程式碼 | 日期時間元素描述 | 範例 |
|---|---|---|
| %a, %A | 星期幾的縮寫/完整名稱 | Mon, Monday |
| %b, %B | 月份的縮寫/完整名稱 | Feb, February |
| %c | 本地預設日期時間表示法 | 取決於地區設定 |
| %C | 世紀(年份除以 100 後向下取整) | 2021 年對應 20 |
| %d | 月份中的第幾天(兩位數) | 06 |
| %D | 月/日/年(%m/%d/%y) | 01/01/21 |
| %e | 月份中的第幾天(個位數不補零) | 6 |
| %F | ISO 8601 日期格式(%Y-%m-%d) | 2021-12-31 |
| %H | 小時(24 小時制,兩位數) | 02 |
| %I, %l | 小時(12 小時制,兩位數/一位數) | 01, 1 |
| %j | 年中的第幾天(三位數) | 211 |
| %L | 毫秒(三位數) | 021 |
| %m | 月份(兩位數) | 08 |
| %M | 分鐘(兩位數) | 09 |
日期和時間表示法的應用
正確理解和使用日期和時間表示法對於組態 Fluentd 的輸入和輸出外掛非常重要,尤其是在處理包含時間戳的日誌資料時。
相關資源連結
程式碼範例與解析
require 'redis'
# 建立 Redis 連線
redis = Redis.new(host: 'localhost', port: 6379)
# 設定鍵值對
redis.set('key', 'value')
# 取得鍵值對
value = redis.get('key')
puts value # 輸出 "value"
程式碼解密:
- 首先,我們引入了
redis程式函式庫,以便在 Ruby 中使用 Redis 功能。 - 然後,建立了一個連線到本地 Redis 伺服器的例項,指定主機為
localhost,埠號為6379。 - 使用
set方法設定了一個鍵值對,其中鍵為'key',值為'value'。 - 接著,使用
get方法檢索鍵'key'對應的值,並將其儲存在變數value中。 - 最後,輸出變數
value的值,此時應該是"value"。
這段程式碼展示瞭如何在 Ruby 中使用 Redis Gem 與 Redis 資料函式庫進行基本的互動。
日期與時間表示法
在處理日期與時間的過程中,我們經常需要以特定的格式來表達這些資訊。以下是一些常見的日期與時間表示法:
時間的小數部分表示
%N或%9N:以納秒(9 位數字)表示秒的小數部分。%6N:以微秒(6 位數字)表示秒的小數部分。%3N:以毫秒(3 位數字)表示秒的小數部分。
上下午表示
%p:以上午或下午(大寫)表示,例如 AM 或 PM。%P:以上午或下午(小寫)表示,例如 am 或 pm。
時間表示的捷徑
%r:12 小時制時間表示,等同於%I:%M:%S %p,例如 01:02:06 PM。%R:24 小時制時間表示,等同於%H:%M,例如 15:01。%T:24 小時制時間表示到秒,等同於%H:%M:%S,例如 01:59:11。
日期與星期表示
%u:以數字表示星期幾,星期一為 1,例如 7。%U:一年中的第幾週,以兩位數字表示,第一個星期日為第一週的第一天,例如 52。%V:ISO 8601 標準的週數,等同於%U的替代方案,例如 01。%w:以數字表示星期幾,星期日為 0,例如 6。
年份與時區表示
%y:年份的最後兩位數字,例如 21。%Y:完整的年份,例如 2021。%z:時區偏移,以正負四位數字表示相對於 UTC 的偏移,例如 +0930。%Z:時區名稱,例如 BST。
資料大小表示法
在某些屬性中,可以使用特定的單位來表示資料大小,從位元組到兆位元組不等。以下是常見的資料大小表示法:
資料大小單位
| 單位 | 說明 | 範例 |
|---|---|---|
| - | 位元組 | 100 表示 100 位元組 |
| k | 千位元組 (Kb) | 12k 表示 12 千位元組 |
| m | 百萬位元組 (MB) | 5m 表示 5 百萬位元組 |
| g | 吉位元組 (GB) | 3g 表示 3 吉位元組 |
| T | 太位元組 (TB) | 1T 表示 1 太位元組 |
正規表示式
正規表示式是用於處理字串的強大工具,可以用來搜尋特定的模式或將字串分割成多個部分。以下是 Ruby 中使用的正規表示式的一些基本元素:
跳脫碼
跳脫碼提供了預先定義的字元群組,可以用來匹配特定的字元。
| 跳脫碼 | 說明 |
|---|---|
. | 除換行符外的任意字元 |
\d | 數字字元 ([0-9]) |
\D | 非數字字元 ([^0-9]) |
\h | 十六進位制數字字元 ([0-9a-fA-F]) |
\H | 非十六進位制數字字元 ([^0-9a-fA-F]) |
\s | 空白字元 ([\t\r\n\f\v]) |
\S | 非空白字元 ([^ \t\r\n\f\v]) |
\w | 字詞字元 ([a-zA-Z0-9_]) |
\W | 非字詞字元 |
重複與選擇
這些字元可以用來定義不同的重複模式和可接受的值範圍。
| 字元 | 說明 |
|---|---|
* | 重複零次或多次 |
? | 重複零次或一次(可選) |
[n,m] | 定義可接受的值範圍 |
{n,m} | 重複至少 n 次且最多 m 次 |
###錨點、群組與替代
錨點是用來匹配特定位置的字元,而群組則是用來定義原子群組。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Fluentd 工具服務設定與延伸應用
package "Docker 架構" {
actor "開發者" as dev
package "Docker Engine" {
component [Docker Daemon] as daemon
component [Docker CLI] as cli
component [REST API] as api
}
package "容器運行時" {
component [containerd] as containerd
component [runc] as runc
}
package "儲存" {
database [Images] as images
database [Volumes] as volumes
database [Networks] as networks
}
cloud "Registry" as registry
}
dev --> cli : 命令操作
cli --> api : API 呼叫
api --> daemon : 處理請求
daemon --> containerd : 容器管理
containerd --> runc : 執行容器
daemon --> images : 映像檔管理
daemon --> registry : 拉取/推送
daemon --> volumes : 資料持久化
daemon --> networks : 網路配置
@enduml
詳細說明:
此圖示展示了錨點、群組和替代的概念及其相關符號。
Docker 標籤自定義
在 Docker 日誌驅動程式的 log-opts 組態中,可以透過設定 log-opts 的標籤部分來自定義輸出標籤。這可以透過使用預定義的範本標記來實作,如下表所示。
Docker 標籤範本標記
| 標記 | 說明 |
|---|---|
{{.ID}} | 容器的前 12 個字元 ID |
{{.FullID}} | 容器的完整 64 字元 ID |
{{.Name}} | 容器的名稱 |
{{.ImageID}} | 影像的前 12 個字元 ID |
{{.ImageFullID}} | 影像的完整 ID |
{{.ImageName}} | 被容器使用的影像名稱 |
{{.DaemonName}} | 執行容器的軟體守護程式名稱(即 Docker) |
程式碼範例:
# 自定義 Docker 標籤
log_opt = {
tag: "{{.ID}}-{{.ImageID}}"
}
#### 內容解密:
此範例展示瞭如何使用 Docker 日誌驅動程式的 log-opts 組態來自定義輸出標籤。其中,{{.ID}} 和 {{.ImageID}} 是預定義的範本標記,分別代表容器的前 12 個字元 ID 和影像的前 12 個字元 ID。透過這種方式,可以靈活地定義日誌標籤的格式。
格式化外掛
格式化外掛用於將日誌事件轉換為特定的格式。Fluentd 核心提供了多種格式化外掛,包括:
- csv:將日誌事件轉換為 CSV 格式。
- hash:將日誌事件轉換為 Ruby 的雜湊格式。
- json:將日誌事件轉換為 JSON 格式。
- ltsv:將日誌事件轉換為 LTSV 格式。
- msgpack:將日誌事件壓縮為 msgpack 格式。
- out_file:將日誌事件輸出到檔案中。
- single_value:將日誌事件中的單個值輸出。
這些外掛可以幫助使用者根據需要將日誌事件轉換為不同的格式。
程式碼範例
# 使用 json 格式化外掛
<match example.**>
@type file
path /path/to/log/file.log
<format>
@type json
</format>
</match>
內容解密:
@type file指定輸出型別為檔案。path指定輸出檔案的路徑。<format>區塊指定輸出的格式。@type json指定使用 json 格式化外掛。
過濾外掛
過濾外掛用於對日誌事件進行過濾和處理。Fluentd 核心提供了多種過濾外掛,包括:
- add:新增 UUID 和其他額外的鍵值對。
- anonymizer:對日誌事件中的敏感資料進行匿名化處理。
- autotype:根據日誌事件的內容自動推斷資料型別。
- filter_parser:結合解析器外掛和過濾功能。
- record_modifier:修改日誌事件中的記錄。
- record_transformer:對日誌事件進行複雜的轉換。
這些外掛可以幫助使用者對日誌事件進行過濾和處理,以滿足不同的需求。
程式碼範例
# 使用 record_transformer 過濾外掛
<filter example.**>
@type record_transformer
<record>
hostname ${hostname}
</record>
</filter>
內容解密:
@type record_transformer指定使用 record_transformer 過濾外掛。<record>區塊指定要新增或修改的記錄。hostname ${hostname}新增一個名為hostname的鍵,其值為當前主機名。
標籤操作外掛
標籤操作外掛用於對日誌事件的標籤進行操作。Fluentd 核心提供了多種標籤操作外掛,包括:
- geoip:根據 IP 地址取得地理位置資訊。
- grep:根據規則過濾日誌事件。
- rewrite:根據規則重寫標籤。
- rewrite-tag-filter:根據規則重寫標籤並重新傳送日誌事件。
- route:根據標籤路由日誌事件。
這些外掛可以幫助使用者對日誌事件的標籤進行操作,以滿足不同的需求。
程式碼範例
# 使用 geoip 標籤操作外掛
<filter example.**>
@type geoip
geoip_lookup_keys remote_ip
<record>
country ${country.names.en}
</record>
</filter>
內容解密:
@type geoip指定使用 geoip 標籤操作外掛。geoip_lookup_keys remote_ip指定要查詢的鍵為remote_ip。<record>區塊指定要新增或修改的記錄。country ${country.names.en}新增一個名為country的鍵,其值為查詢到的國家名稱。
預防警示風暴的外掛
在處理大量日誌資料時,連續的錯誤流可能導致警示風暴。為瞭解決這個問題,Fluentd 提供了幾款專門的外掛:
日誌抑制外掛
- Log suppression filter:根據設定的日誌事件屬性,在一定時間內重複出現的相同日誌條目將被抑制,避免無謂的警示。
- Log4J2 外掛:在 Log4J2 框架內部過濾日誌事件,減少匹配特定規則的日誌輸出。
- Log4Net:針對 .Net 環境的 Log4J2 解決方案變體。
這些外掛透過不同的機制來控制和減少不必要的日誌輸出,從而有效預防警示風暴。
分析與指標外掛
為了更好地理解和監控系統狀態,Fluentd 提供了多種分析與指標相關的外掛:
指標收集與輸出外掛
- Fluent-plugin-prometheus:整合了多個外掛,能夠提供 Prometheus 相容的指標端點,收集 Fluentd 內部指標、輸出外掛指標以及 Tail 外掛的監控指標。
- Fluentd Elasticsearch 外掛:將日誌事件傳送到 Elasticsearch,提供豐富的組態選項。
- Fluentd 資料計數器:根據正規表示式模式匹配計數日誌事件,提供每分鐘/小時/天的計數、平均每秒計數以及各模式在總計數中的百分比。
這些外掛能夠幫助使用者建立對日誌資料的深入分析與監控能力。
自定義外掛開發介面
對於需要擴充套件 Fluentd 功能的開發者來說,瞭解其外掛介面是至關重要的。以下是開發輸入與輸出外掛時需要實作的主要介面:
輸入外掛介面
| 函式原型 | 描述 |
|---|---|
def emit | 過載 Fluent::Input 類別方法以滿足自定義需求。 |
def run | 設定迴圈執行緒,若無資料可傳送則進入睡眠狀態。 |
def configure(conf) | 處理組態值並進行驗證。 |
def start | 生存週期事件,啟動連線建立。 |
def shutdown | 資源釋放,如斷開連線。 |
輸出外掛介面
| 函式原型 | 描述 |
|---|---|
def commit_write(chunk_id) | 告知實作寫入的 chunk ID,完成後 Fluentd 將清除該 chunk。 |
def configure(conf) | 處理組態值並進行驗證。 |
def format(tag, time, record) | 將日誌事件序列化以存放於 chunk 中。 |
def formatted_to_msgpack_binary? | 指示自定義格式方法是否傳回 MessagePack 二進位。 |
def write(chunk) | 同步寫出 chunk 中的資料。 |
透過實作這些介面,開發者可以建立出滿足特定需求的輸入與輸出外掛,從而擴充套件 Fluentd 的功能。