一、ELK Stack 采集 syslog 日志的主要方式
通常,ELK Stack 使用 Logstash 或者 Filebeat 來采集 syslog 日志。 Beats 通常更輕量級,適合作為代理部署在各個日志源服務器上,而 Logstash 則功能更強大,可以進行更復雜的日志處理和轉換。 選擇 Logstash 還是 Filebeat 取決于你的具體需求和環境規模。
1、使用 Logstash 采集 syslog
Logstash 擁有專門的 syslog
輸入插件 (input plugin),可以直接監聽 syslog 協議傳輸的日志消息。 這是采集 syslog 日志最常見和推薦的方式。
-
Logstash
syslog
輸入插件的優勢:- 直接監聽 syslog 協議: 無需將 syslog 日志寫入文件,直接從網絡端口接收 syslog 消息,實時性更高。
- 支持 UDP 和 TCP 協議: 兼容常見的 syslog 傳輸協議。
- 內置 Grok 模式:
syslog
輸入插件通常會配合grok
過濾器插件一起使用,方便解析 syslog 消息的結構化字段。 - 性能良好: Logstash 可以高效地處理大量的 syslog 消息。
-
Logstash
syslog
輸入插件配置要點:port
: 指定 Logstash 監聽的端口,syslog 默認端口通常是514
。 需要確保防火墻允許流量通過該端口。protocol
: 指定 syslog 協議,可以是udp
或tcp
。 syslog 默認協議通常是 UDP,但 TCP 更可靠。type
: 為 syslog 日志指定一個類型 (type),方便在后續的 Filter 和 Kibana 中識別和處理 syslog 日志。 例如可以設置為"syslog"
。grok_pattern
: (可選但強烈建議) 使用 Grok 模式來解析 syslog 消息內容,提取有用的字段,例如時間戳、主機名、進程名、日志級別、消息內容等。 常用的 Grok 模式包括SYSLOGLINE
(用于通用 syslog 格式) 和CISCOSYSLOGLINE
(用于 Cisco 設備 syslog 格式)。
-
Logstash
syslog
輸入插件配置示例 (logstash.conf):假設我們要監聽 UDP 端口
514
,采集 syslog 日志,并使用SYSLOGLINE
Grok 模式解析通用 syslog 格式的日志。input {syslog {port => 514protocol => "udp"type => "syslog"} }filter {grok {match => { "message" => "%{SYSLOGLINE}" }}date {match => [ "timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ] # 匹配 syslog 常見的時間戳格式remove_field => ["timestamp"] # 刪除原始的 timestamp 字段,使用 @timestamp 作為標準時間字段} }output {elasticsearch {hosts => ["http://<Elasticsearch服務器IP>:9200"] # 替換為你的 Elasticsearch 服務器地址index => "syslog-%{+YYYY.MM.dd}" # 索引名稱,按天創建索引}stdout { codec => rubydebug } # 同時輸出到控制臺,方便調試 }
配置說明:
input syslog
: 配置syslog
輸入插件,監聽 UDP 端口 514,類型設置為 "syslog"。filter grok
: 使用grok
過濾器,match
定義匹配規則,"message" => "%{SYSLOGLINE}"
表示對message
字段(syslog 消息內容)應用SYSLOGLINE
Grok 模式進行解析。SYSLOGLINE
是 Logstash 內置的 Grok 模式,用于解析通用的 syslog 格式。 你可以根據實際的 syslog 日志格式調整 Grok 模式,或者自定義 Grok 模式。filter date
: 由于 syslog 日志的時間戳格式可能與 Elasticsearch 默認的時間格式不同,使用date
過濾器來解析時間戳字段。match
定義要匹配的字段和時間格式。target => "@timestamp"
將解析后的時間戳設置為@timestamp
字段,這是 Elasticsearch 標準的時間字段。output elasticsearch
: 配置 Elasticsearch 輸出插件,將解析后的 syslog 日志輸出到 Elasticsearch 中。hosts
指定 Elasticsearch 服務器地址,index
定義索引名稱,使用日期動態索引syslog-%{+YYYY.MM.dd}
,方便按日期管理索引。output stdout
:stdout
輸出插件用于將日志輸出到控制臺,codec => rubydebug
以易于閱讀的 Rubydebug 格式輸出,方便調試 Logstash 配置。 生產環境中可以移除stdout
輸出。
-
配置 syslog 發送端 (設備或服務器):
你需要配置你的 syslog 發送端設備或服務器,將 syslog 日志發送到 Logstash 服務器的 IP 地址和配置的端口 (例如 UDP 514)。 具體的配置方法取決于你的設備或操作系統的類型。 例如,在 Linux 系統中,可以配置
rsyslog
或syslog-ng
服務將日志轉發到遠程 Logstash 服務器。 網絡設備 (如路由器、交換機、防火墻) 通常也有 syslog 輸出配置選項。
2、使用 Filebeat 采集 syslog (讀取 syslog 文件)
如果你的 syslog 服務配置為將日志寫入本地文件 (例如 Linux 系統中常見的 /var/log/messages
或 /var/log/syslog
),你可以使用 Filebeat 來讀取這些 syslog 文件,并將日志發送到 Logstash 或 Elasticsearch。
-
Filebeat
log
輸入配置要點:paths
: 指定要監控的 syslog 日志文件路徑,可以使用通配符*
。output.logstash
或output.elasticsearch
: 配置 Filebeat 的輸出目的地,可以將數據直接發送到 Elasticsearch,也可以發送到 Logstash 進行更復雜的處理。processors
: Filebeat 提供了processors
功能,可以在數據發送之前進行一些簡單的處理,例如使用decode_cef
處理器解析 CEF 格式的 syslog 日志,或者使用grok
處理器進行簡單的 Grok 解析。
-
Filebeat 配置文件示例 (filebeat.yml):
假設我們要采集
/var/log/syslog
文件中的 syslog 日志,并將數據發送到 Logstash 進行進一步處理。filebeat.inputs: - type: logenabled: truepaths:- "/var/log/syslog"tags: ["syslog"] # 添加 tag,方便在 Logstash 中識別 syslog 日志output.logstash:hosts: ["<Logstash服務器IP>:5044"] # 替換為你的 Logstash 服務器地址和 Beats 輸入端口 (默認 5044)
Logstash Pipeline 配置 (logstash.conf):
在 Logstash 端,你需要配置 Beats 輸入插件 (
beats
input plugin) 來接收 Filebeat 發送的數據,并進行后續處理 (例如 Grok 解析) 和輸出到 Elasticsearch。input {beats {port => 5044 # Beats 默認輸出端口} }filter {if "syslog" in [tags] { # 根據 Filebeat 添加的 tag 判斷是否為 syslog 日志grok {match => { "message" => "%{SYSLOGLINE}" }}date {match => [ "timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]remove_field => ["timestamp"]}} }output {elasticsearch {hosts => ["http://<Elasticsearch服務器IP>:9200"]index => "filebeat-syslog-%{+YYYY.MM.dd}" # Filebeat 采集的 syslog 日志索引}stdout { codec => rubydebug } }
配置說明:
- Filebeat 配置:
filebeat.inputs
: 配置log
輸入類型,啟用并指定要監控的 syslog 文件路徑/var/log/syslog
。tags: ["syslog"]
: 為采集到的日志添加syslog
標簽,方便在 Logstash 中識別和過濾。output.logstash
: 配置輸出到 Logstash,指定 Logstash 服務器地址和 Beats 輸入端口。
- Logstash 配置:
input beats
: 配置beats
輸入插件,監聽 Beats 默認的 5044 端口,接收 Filebeat 發送的數據。filter
: 使用if "syslog" in [tags]
判斷是否為 Filebeat 發送的 syslog 日志 (通過檢查tags
字段)。 如果是,則應用 Grok 和 Date 過濾器進行解析和時間戳處理。output elasticsearch
: 配置 Elasticsearch 輸出,索引名稱可以設置為filebeat-syslog-%{+YYYY.MM.dd}
,以區分 Logstash 直接監聽 syslog 端口采集的日志。
- Filebeat 配置:
3、直接使用 Beats 模塊 (System 模塊)
Beats (尤其是 Filebeat 和 Metricbeat) 提供了 模塊 (Modules) 功能,預配置了采集特定類型日志和指標的方案,簡化了配置。 Filebeat 的 System 模塊 就包含了采集 syslog 日志的配置。
-
啟用 Filebeat System 模塊:
在 Filebeat 目錄下,執行命令啟用 System 模塊:
./filebeat modules enable system
-
查看 System 模塊配置:
啟用模塊后,Filebeat 的配置文件
modules.d/system.yml
會被啟用 (取消注釋),你可以查看和修改該文件中的配置。 System 模塊默認會采集/var/log/syslog
和/var/log/auth.log
等系統日志文件。 -
Filebeat System 模塊 syslog 配置 (modules.d/system.yml 示例):
- module: systemsyslog:enabled: truevar.paths: ["/var/log/syslog*", "/var/log/messages*"] # 默認監控的 syslog 文件路徑auth:enabled: truevar.paths: ["/var/log/auth.log*", "/var/log/secure*"] # 默認監控的 auth 日志文件路徑
-
輸出配置 (filebeat.yml):
配置 Filebeat 的輸出,例如直接輸出到 Elasticsearch:
output.elasticsearch:hosts: ["http://<Elasticsearch服務器IP>:9200"]# username: "filebeat_internal"# password: "YOUR_PASSWORD"
-
啟動 Filebeat:
啟動 Filebeat 后,System 模塊會自動開始采集配置的 syslog 日志文件,并發送到 Elasticsearch。
-
Kibana Dashboard:
Filebeat System 模塊還提供預置的 Kibana Dashboards,可以方便地可視化系統日志數據。 在首次啟動 Filebeat 或執行
./filebeat setup
命令時,Filebeat 會將這些 Dashboards 導入到 Kibana 中。
4、選擇哪種方式?
- 推薦使用 Logstash
syslog
輸入插件 直接監聽 syslog 端口來采集 syslog 日志,特別是當你需要實時采集大量的 syslog 數據,并且需要對 syslog 數據進行復雜的解析和轉換時。 這種方式性能高,實時性好。 - 如果你的 syslog 服務已經配置為將日志寫入文件,并且只需要進行簡單的采集,可以使用 Filebeat 讀取 syslog 文件并發送到 Logstash 或 Elasticsearch。 Filebeat 更輕量級,資源消耗更低。
- 如果你的需求比較簡單,只需要采集常見的 Linux 系統 syslog 日志,并且希望快速上手,可以使用 Filebeat System 模塊。 System 模塊配置簡單,且提供預置的 Kibana Dashboards。
ELK Stack 能夠非常有效地采集 syslog 中的日志,并且提供了多種靈活的方式來滿足不同的需求。 你可以根據你的實際場景、數據量、性能要求以及對日志處理的復雜程度,選擇合適的采集方式(Logstash syslog
輸入插件、Filebeat 讀取 syslog 文件或 Filebeat System 模塊)。 無論選擇哪種方式,ELK Stack 強大的搜索、分析和可視化能力都能幫助你更好地管理和分析 syslog 日志數據,從而進行故障排查、安全分析、性能監控等。
二、深入理解直接使用Logstash監聽syslog協議
直接使用 Logstash 的 syslog
輸入插件來監聽 syslog 協議,通常情況下是不需要在運行 Logstash 的服務器上額外安裝傳統的 syslog 服務(例如 rsyslog
或 syslog-ng
)的。
下面詳細解釋一下原因:
1、Logstash syslog
輸入插件的功能
-
自帶 syslog 服務器功能: Logstash 的
syslog
輸入插件本身就具備 syslog 服務器 的功能。 它能夠監聽指定的網絡端口(例如 UDP 端口 514 或 TCP 端口 514),并按照 syslog 協議規范接收來自網絡中其他設備或系統發送的 syslog 消息。 -
獨立監聽: 這個插件是 Logstash 自身的功能模塊,它直接在 Logstash 進程內部運行,監聽網絡端口,接收和處理 syslog 數據流。 它 不依賴于 操作系統層面安裝的 syslog 服務(如
rsyslog
或syslog-ng
)來完成接收 syslog 消息的任務。
2、傳統 syslog 服務 (rsyslog
, syslog-ng
) 的角色
-
本地日志管理和轉發: 傳統的 syslog 服務(例如
rsyslog
或syslog-ng
)的主要職責是在 本地系統 上:- 接收本地程序生成的日志: 收集運行在同一臺服務器上的應用程序和系統組件產生的日志。
- 本地日志存儲: 將日志寫入本地文件,進行本地的日志存儲和管理。
- 日志轉發: 可以將本地收集到的日志 轉發 到 遠程的 syslog 服務器。
-
作為 syslog 客戶端: 當需要將一臺服務器或設備上的本地日志發送到遠程 ELK Stack 進行集中管理和分析時,傳統 syslog 服務通常 扮演 syslog 客戶端的角色,負責將本地日志通過 syslog 協議 發送 到 Logstash 服務器。
3、Logstash syslog
輸入插件 vs. 傳統 syslog 服務
-
功能側重點不同:
- Logstash
syslog
輸入插件: 專注于 接收和解析 來自 網絡 的 syslog 消息,目的是將這些消息 導入到 ELK Stack 進行進一步處理和分析。 它主要關注 遠程日志的采集。 - 傳統 syslog 服務 (
rsyslog
,syslog-ng
): 側重于 本地日志的收集、存儲和管理,以及 日志轉發 功能。 它主要關注 本地日志的管理和遠程日志的發送。
- Logstash
-
是否需要安裝:
- Logstash
syslog
輸入插件: 不需要額外安裝 syslog 服務。 只要你的 Logstash 實例運行起來,配置了syslog
輸入插件,它就能直接監聽端口接收 syslog 消息。 - 傳統 syslog 服務 (
rsyslog
,syslog-ng
): 通常 預裝在大多數 Linux 系統中 (例如rsyslog
是很多發行版的默認 syslog 服務)。 如果你需要在 本地 收集和管理日志,或者需要將 本地日志轉發 到遠程服務器,那么就需要配置和使用這些傳統的 syslog 服務。
- Logstash
4、應用場景舉例說明
-
集中采集網絡設備 Syslog 到 ELK Stack
- 場景:你需要將網絡設備(例如路由器、交換機、防火墻)產生的 syslog 日志集中采集到 ELK Stack 進行安全分析和監控。
- 部署方式:
- 在 ELK Stack 服務器上運行 Logstash,并配置
syslog
輸入插件監聽 UDP 端口 514。 - 在網絡設備上配置 syslog 輸出,將 syslog 日志 發送到 Logstash 服務器的 IP 地址和端口 514。
- 不需要 在 Logstash 服務器上安裝
rsyslog
或syslog-ng
。
- 在 ELK Stack 服務器上運行 Logstash,并配置
- 工作流程:網絡設備直接將 syslog 消息發送給 Logstash 服務器的 514 端口,Logstash
syslog
輸入插件接收并處理這些消息,然后導入 ELK Stack。
-
服務器本地日志采集并轉發到 ELK Stack
- 場景:你需要采集 Linux 服務器自身的系統日志 (例如
/var/log/syslog
,/var/log/messages
),并發送到 ELK Stack 進行分析。 - 部署方式 (方案一:使用 Logstash
syslog
輸入插件):- 在 ELK Stack 服務器上運行 Logstash,配置
syslog
輸入插件監聽 UDP 端口 514。 - 在 Linux 服務器上,配置 本地的
rsyslog
或syslog-ng
服務,將其配置為 syslog 客戶端,將本地系統日志 轉發 到 Logstash 服務器的 IP 地址和端口 514。 - 需要 本地服務器運行
rsyslog
或syslog-ng
作為 syslog 客戶端來轉發日志。 不需要 在 Logstash 服務器上額外安裝 syslog 服務,因為 Logstash 已經自帶 syslog 服務器功能。
- 在 ELK Stack 服務器上運行 Logstash,配置
- 部署方式 (方案二:使用 Filebeat 讀取日志文件):
- 在 Linux 服務器上安裝 Filebeat。
- 配置 Filebeat 讀取本地的系統日志文件 (例如
/var/log/syslog
)。 - 配置 Filebeat 將日志 直接發送到 Elasticsearch 或 Logstash。
- 在 ELK Stack 服務器上運行 Elasticsearch 和 Kibana (如果 Filebeat 直接發送到 Elasticsearch) 或 Logstash (如果 Filebeat 發送到 Logstash 進行處理)。
- 不需要 在 ELK Stack 服務器上安裝 syslog 服務,也 不需要 在 Linux 服務器上配置 syslog 服務進行轉發(Filebeat 直接讀取日志文件)。
- 場景:你需要采集 Linux 服務器自身的系統日志 (例如
5、總結
- Logstash 的
syslog
輸入插件 提供了 內置的 syslog 服務器功能,可以獨立接收和處理 syslog 消息, 無需依賴 操作系統層面的傳統 syslog 服務來接收 syslog 數據。 - 傳統 syslog 服務 (
rsyslog
,syslog-ng
) 在 ELK Stack 場景中,通常作為 syslog 客戶端 的角色出現,負責將 本地日志轉發 到遠程的 Logstash 服務器,或者用于 本地日志的收集和管理。
因此,如果你只是想使用 ELK Stack 直接監聽 來自網絡設備的 syslog 協議數據,那么 不需要 在運行 Logstash 的服務器上安裝 rsyslog
或 syslog-ng
。 Logstash 的 syslog
輸入插件已經足夠勝任 syslog 服務器的角色了。 你只需要確保 Logstash 服務器的網絡端口(例如 514)對外開放,并且網絡設備配置正確,將 syslog 日志發送到 Logstash 服務器即可。
三、示例:IBM ISVA配置使用ELK Stack
當需要在 IBM ISVA 或其他支持 syslog 輸出的設備上配置日志目標時,您可以將運行 Logstash 的服務器當作一個 syslog 服務器來對待。
以下是如何實現這個目標的核心思路和步驟:
1、配置 Logstash 作為 Syslog 服務器 (監聽 Syslog 接口):
-
使用
syslog
輸入插件: 在您的 Logstash 配置文件中,使用syslog
輸入插件來定義 Logstash 監聽 syslog 協議的接口。 -
指定監聽端口和協議: 在
syslog
輸入插件的配置中,您需要指定 Logstash 監聽的端口(通常是 UDP 端口 514,或者 TCP 端口 514,取決于您的需求和 IBM ISVA 的配置選項)以及協議類型 (UDP 或 TCP)。 -
示例 Logstash 配置 (片段,
input
部分):input {syslog {port => 514 # 監聽 514 端口 (默認 syslog UDP 端口)protocol => "udp" # 使用 UDP 協議 (如果 IBM ISVA 也配置為 UDP)type => "isva-syslog" # 為來自 ISVA 的 syslog 日志添加類型標簽,方便后續處理} }
- 重要: 請確保運行 Logstash 的服務器的防火墻允許來自 IBM ISVA 的 syslog 流量通過您配置的端口 (例如 UDP 514)。
2、配置 IBM ISVA 的 Syslog 輸出:
-
找到 Syslog 配置選項: 在 IBM ISVA 的管理界面或配置工具中,找到關于日志記錄或事件輸出的相關配置,通常會有一個配置 syslog 服務器的選項。 具體位置和名稱可能因 ISVA 版本而異,但通常會在系統設置、日志設置、事件轉發等部分。
-
配置 Syslog 服務器地址: 在 ISVA 的 syslog 配置中,您需要指定:
- Syslog 服務器 IP 地址: 填寫運行 Logstash 的服務器的 IP 地址。
- Syslog 服務器端口: 填寫您在 Logstash
syslog
輸入插件中配置的端口 (例如 514)。 - Syslog 協議: 選擇與 Logstash 配置一致的協議類型 (UDP 或 TCP)。 如果可以選擇,TCP 通常更可靠,但 UDP 更常用在 syslog 場景中。
- Syslog 格式 (可選): 某些設備可能允許您選擇 syslog 輸出的格式(例如 RFC3164, RFC5424 等)。 通常默認格式即可,Logstash 的
syslog
輸入插件能夠處理多種常見的 syslog 格式。 - 要發送的日志類型/事件: IBM ISVA 通常會允許您選擇要通過 syslog 發送的日志類型或事件級別,例如審計日志、系統日志、安全事件等。 根據您的需求選擇要發送的日志類型。
-
配置示例 (概念性,具體界面和選項以 IBM ISVA 文檔為準):
假設在 ISVA 管理界面中找到 syslog 配置部分,您可能需要填寫類似以下的信息:
- 啟用 Syslog 輸出: [復選框] (勾選以啟用)
- Syslog 服務器 IP 地址:
[運行 Logstash 的服務器 IP 地址]
(例如192.168.1.100
) - Syslog 服務器端口:
[514]
- Syslog 協議:
[UDP]
(或[TCP]
,如果 Logstash 配置為 TCP) - Syslog 格式:
[RFC3164]
(或其他默認格式) - 發送的日志類型: [審計日志], [系統事件], [安全事件] (根據您的需求選擇)
?
3、配置 Logstash Pipeline 后續處理 (Filter 和 Output):
-
Filter 插件 (可選但推薦): 您可能需要使用 Logstash 的 Filter 插件,例如
grok
插件,來解析來自 IBM ISVA 的 syslog 日志消息,提取結構化字段,例如時間戳、事件類型、用戶、源 IP 地址等,以便更好地進行搜索、分析和可視化。 -
Output 插件 (必須): 配置 Logstash 的 Output 插件,將接收和處理后的 IBM ISVA syslog 日志數據輸出到 Elasticsearch 中進行存儲和索引。 通常使用
elasticsearch
輸出插件。 -
示例 Logstash 配置 (片段,
filter
和output
部分 - 可能需要根據 ISVA 日志格式調整):filter {if [type] == "isva-syslog" { # 針對 ISVA syslog 日志進行處理grok {# 這里需要根據 IBM ISVA syslog 的實際日志格式編寫 Grok 表達式# 示例 (可能需要調整): %{SYSLOGTIMESTAMP:syslog_timestamp} %{HOSTNAME:isva_hostname} %{GREEDYDATA:isva_message}match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{HOSTNAME:isva_hostname} %{GREEDYDATA:isva_message}" }}date {match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ] # 解析 syslog 時間戳target => "@timestamp" # 將解析后的時間戳設置為標準 @timestamp 字段remove_field => ["syslog_timestamp"] # 刪除臨時字段}} }output {elasticsearch {hosts => ["http://<Elasticsearch服務器IP>:9200"] # 替換為您的 Elasticsearch 服務器地址index => "isva-syslog-%{+YYYY.MM.dd}" # 為 ISVA syslog 日志創建獨立的索引}stdout { codec => rubydebug } # 方便調試,生產環境可以移除 }
4、在 Kibana 中可視化和分析 IBM ISVA Syslog 日志:
- 創建 Index Pattern: 在 Kibana 中創建 Index Pattern,例如
isva-syslog-*
,指向您在 Logstash 配置中定義的 Elasticsearch 索引。 - 使用 Discover 和 Visualize: 使用 Kibana 的 Discover 功能探索和搜索來自 IBM ISVA 的 syslog 日志數據。 創建各種可視化圖表 (例如儀表盤) 來監控和分析 ISVA 的運行狀態、安全事件等。
5、總結:
通過以上配置,您就可以成功地將 ELK Stack (Logstash) 作為 syslog 服務器使用,直接接收來自 IBM ISVA (或其他支持 syslog 輸出的設備) 的日志,并利用 ELK Stack 強大的功能進行日志管理、分析和可視化。 這種方式非常靈活且高效,能夠幫助您集中監控和分析各種來源的日志數據。