本教程詳細介紹了如何建構監控管道以使用 ELK 7.2 和 Rsyslog 分析 Linux 日志。
如果您是系統管理者,甚至是好奇的應用程式開發人員,您很有可能會定期挖掘日志以在其中找到寶貴的資訊。
有時您可能想要監控虛拟機上的SSH 入侵。
有時,您可能希望檢視應用程式伺服器在某一天、一個非常特定的時間引發了哪些錯誤。或者,您可能想了解誰在您的一個虛拟機上停止了您的 systemd 服務。
如果您在其中一個方面描繪自己,那麼您可能是在正确的教程上。
在本教程中,我們将使用 ELK 堆棧(ElasticSearch、Logstash 和 Kibana)和 Rsyslog 作為強大的 syslog 伺服器來建構完整的日志監控管道。
在進一步讨論并立即進入技術考慮之前,讓我們先談談為什麼要使用 Kibana 監控 Linux 日志。
目錄
- I – 為什麼要監控 Linux 日志?
- II – 你會學到什麼
- III – 日志監控架構是什麼樣的?a – Linux logging 的關鍵概念b – 建構日志監控架構
- IV – 安裝不同的工具a – 在 Ubuntub 上安裝 Javab – 将彈性包添加到您的執行個體c – 安裝 ElasticSearchd – 安裝 Logstashe – 安裝 Kibana
- V – 将 Linux 日志路由到 ElasticSearcha – 從 Logstash 路由到 ElasticSearchb – 從 rsyslog 路由到 Logstash
- VI – 在基巴納中建構日志儀表闆 – Kibanab 上的幾句話 – 程序的聚合條形圖 c – 按程式命名的餅圖 – 按嚴重程度的餅圖 – 監控 SSH 條目
- VI – 結論
I – 為什麼要監控 Linux 日志?
監控 Linux 日志至關重要,每個 DevOps 工程師都應該知道如何去做。原因如下:
- 您對日志有實時的視覺回報:這可能是日志監控的關鍵方面之一,您可以建構有意義的可視化(例如資料表、餅圖、圖表或聚合條形圖)來賦予日志一些意義。
- 您可以彙總資訊以建構進階和更複雜的儀表闆:有時原始資訊還不夠,您可能希望将其與其他日志結合或與其他日志進行比較以識别趨勢。具有表達式處理功能的可視化平台可讓您執行此操作。
- 您可以快速過濾某個術語,或給定某個時間段:如果您隻對 SSH 日志感興趣,則可以為其建構有針對性的儀表闆。
- 日志可以以一種快速而優雅的方式導航:我知道無休止地跟蹤和 grep 日志檔案的痛苦。我甯願有一個平台。
II – 你會學到什麼
如果您遵循本教程,您将學到很多東西:
- 在 Linux 系統(Ubuntu 或 Debian)上如何處理日志以及 rsyslog 是什麼。
- 如何安裝ELK 堆棧(ElasticSearch 7.2、Logstash 和 Kibana)以及這些工具的用途。
- 如何配置rsyslog将日志轉發到 Logstash
- 如何為日志攝取和 ElasticSearch 存儲配置 Logstash 。
- 如何使用 Kibana 建構我們最終的可視化儀表闆。
本教程的先決條件如下:
- 你有一個安裝了 rsyslog的 Linux 系統。您要麼擁有一台帶有 rsyslog 的獨立機器,要麼擁有一個集中式日志系統。
- 你有管理者權限或者你有足夠的權限在你的 Linux 系統上安裝新的包。
事不宜遲,讓我們開始吧!
III – 日志監控架構是什麼樣的?
a – Linux 日志記錄的關鍵概念
在詳細介紹我們的日志監控架構是什麼樣子之前,讓我們先回到過去。
從曆史上看,Linux 日志記錄從syslog 開始。
Syslog 是 1980 年開發的一種協定,旨在标準化日志的格式化方式,不僅适用于 Linux,而且适用于任何交換日志的系統。
從那裡開始,系統日志伺服器被開發并嵌入了處理系統日志消息的能力。
它們迅速發展到功能,例如過濾、具有内容路由能力,或者可能是此類伺服器的關鍵特性之一:存儲日志和輪換它們。
Rsyslog 的開發牢記這一關鍵功能:具有子產品化和可定制的方式來處理日志。
子產品化将通過子產品來處理,并通過日志模闆進行定制。
在某種程度上,rsyslog 可以從許多不同的來源攝取日志,并且可以将它們轉發到更廣泛的目的地集。這就是我們将在教程中使用的内容。
b – 建構日志監控架構
這是我們将用于本教程的最終架構。
- rsyslog:用作進階系統日志伺服器,rsyslog 将日志以我們之前描述的 RFC 5424 格式轉發到 Logstash。
- Logstash:ELK 堆棧的一部分,Logstash 會将日志從 syslog 格式轉換為 JSON。提醒一下,ElasticSearch 将 JSON 作為輸入。
- ElasticSearch:著名的搜尋引擎将日志存儲在專用的日志索引(logstash-*)中。ElasticSearch 會自然地索引日志并使它們可用于分析。
- Kibana:用作探索和可視化平台,Kibana 将托管我們的最終儀表闆。
現在我們知道了我們前進的方向,讓我們安裝所需的不同工具。
IV – 安裝不同的工具
a – 在 Ubuntu 上安裝 Java
在安裝 ELK 堆棧之前,您需要在計算機上安裝 Java。
為此,請運作以下指令:
$ sudo apt-get install default-jre
在編寫本教程時,此執行個體運作OpenJDK 版本 11。
ubuntu:~$ java -version
openjdk version "11.0.3" 2019-04-16
OpenJDK Runtime Environment (build 11.0.3+7-Ubuntu-1ubuntu218.04.1)
OpenJDK 64-Bit Server VM (build 11.0.3+7-Ubuntu-1ubuntu218.04.1, mixed mode, sharing)
b – 将彈性包添加到您的執行個體
對于本教程,我将使用 Ubuntu 機器,但将提供 Debian 機器的詳細資訊。
首先,将 GPG 密鑰添加到您的 APT 存儲庫。
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
然後,您可以将 Elastic 源添加到您的 APT 源清單檔案中。
$ echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
$ cat /etc/apt/sources.list.d/elastic-7.x.list
deb https://artifacts.elastic.co/packages/7.x/apt stable main
$ sudo apt-get update
從那裡,您應該準備好安裝 ELK 堆棧中的每個工具。
讓我們從 ElasticSearch 開始。
c – 安裝 ElasticSearch
ElasticSearch 是由 Elastic 建構的搜尋引擎,可将資料存儲在索引中以實作非常快速的檢索。
要安裝它,請運作以下指令:
$ sudo apt-get install elasticsearch
以下指令将自動:
- 下載下傳 ElasticSearch 的 deb 包;
- 建立一個elasticsearch使用者;
- 建立一個elasticsearch組;
- 自動建立一個完全配置的 systemd 服務(預設不活動)
首次啟動時,該服務處于非活動狀态,啟動它并確定一切運作順利。
$ sudo systemctl start elasticsearch
● elasticsearch.service - Elasticsearch
Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; disabled; vendor preset: enabled)
Active: active (running) since Mon 2019-07-08 18:19:45 UTC; 2 days ago
Docs: http://www.elastic.co
為了確定 ElasticSearch 實際運作,您可以執行以下兩個指令之一:
- 檢視哪些應用程式在目标端口上偵聽
$ sudo lsof -i -P -n | grep LISTEN | grep 9200
java 10667 elasticsearch 212u IPv6 1159208890 0t0 TCP [::1]:9200 (LISTEN)
java 10667 elasticsearch 213u IPv6 1159208891 0t0 TCP 127.0.0.1:9200 (LISTEN)
- 執行一個簡單的 ElasticSearch 查詢
$ curl -XGET 'http://localhost:9200/_all/_search?q=*&pretty'
您的 ElasticSearch 執行個體已設定完畢!
現在,讓我們安裝 Logstash 作為我們的日志收集和過濾工具。
d - 安裝 Logstash
如果您之前添加了 Elastic 包,那麼安裝 Logstash 就像執行一樣簡單:
$ sudo apt-get install logstash
同樣,将建立一個 Logstash 服務,您需要激活它。
$ sudo systemctl status logstash
$ sudo systemctl start logstash
預設情況下,Logstash 偵聽端口 9600 上的名額。和我們之前所做的一樣,列出您計算機上的開放端口以查找該特定端口。
$ sudo lsof -i -P -n | grep LISTEN | grep 9600
java 28872 logstash 79u IPv6 1160098941 0t0 TCP 127.0.0.1:9600 (LISTEN)
偉大的!
我們隻需要安裝 Kibana 即可完成整個設定。
e - Kibana
提醒一下,Kibana 是為 ElasticSearch 量身定制的可視化工具,用于監控我們的最終日志。
并不奇怪,但這裡是安裝 Kibana 的指令:
$ sudo apt-get install kibana
像往常一樣,啟動服務并驗證它是否正常工作。
$ sudo systemctl start kibana
$ sudo lsof -i -P -n | grep LISTEN | grep 5601
node 7253 kibana 18u IPv4 1159451844 0t0 TCP *:5601 (LISTEN)
Kibana Web UI在端口 5601 上可用。
使用浏覽器通路http://localhost:5601,您應該會看到以下螢幕。
好的!
我們現在已經準備好從 rsyslog 提取日志并開始在 Kibana 中可視化它們。
V – 将 Linux 日志路由到 ElasticSearch
提醒一下,我們正在将日志從 rsyslog 路由到 Logstash,這些日志将自動傳輸到 ElasticSearch。
a – 從 Logstash 到 ElasticSearch 的路由
在将日志從 rsyslog 路由到 Logstash 之前,我們在 Logstash 和 ElasticSearch 之間設定日志轉發非常重要。
為此,我們将為 Logstash 建立一個配置檔案,并準确告訴它要做什麼。
要建立 Logstash 配置檔案,請轉到/etc/logstash/conf.d并建立一個 logstash.conf 檔案。
在裡面,附加以下内容:
input {
udp {
host => "127.0.0.1"
port => 10514
codec => "json"
type => "rsyslog"
}
}
# The Filter pipeline stays empty here, no formatting is done. filter { }
# Every single log will be forwarded to ElasticSearch. If you are using another port, you should specify it here.
output {
if [type] == "rsyslog" {
elasticsearch {
hosts => [ "127.0.0.1:9200" ]
}
}
}
注意:對于本教程,我們為 Logstash 使用UDP 輸入,但如果您正在尋找一種更可靠的方式來傳輸日志,您可能應該使用TCP 輸入。格式幾乎相同,隻需将 UDP 線路更改為 TCP。
重新啟動 Logstash 服務。
$ sudo systemctl restart logstash
要驗證一切是否正常運作,請發出以下指令:
$ netstat -na | grep 10514
udp 0 0 127.0.0.1:10514 0.0.0.0:*
偉大的!
Logstash 現在正在偵聽端口 10514。
b – 從 rsyslog 路由到 Logstash
如前所述,rsyslog 有一組不同的子產品,允許它将傳入的日志傳輸到廣泛的目标集。
Rsyslog 具有使用模闆轉換日志的能力。這正是我們正在尋找的,因為 ElasticSearch 期望 JSON 作為輸入,而不是 syslog RFC 5424 字元串。
為了在 rsyslog 中轉發日志,轉到/etc/rsyslog.d并建立一個名為70-output.conf的新檔案
在您的檔案中,寫入以下内容:
# This line sends all lines to defined IP address at port 10514
# using the json-template format.
*.* @127.0.0.1:10514;json-template
現在您已經完成了日志轉發,在同一檔案夾中建立一個01-json-template.conf檔案,并粘貼以下内容:
template(name="json-template"
type="list") {
constant(value="{")
constant(value="\"@timestamp\":\"") property(name="timereported" dateFormat="rfc3339")
constant(value="\",\"@version\":\"1")
constant(value="\",\"message\":\"") property(name="msg" format="json")
constant(value="\",\"sysloghost\":\"") property(name="hostname")
constant(value="\",\"severity\":\"") property(name="syslogseverity-text")
constant(value="\",\"facility\":\"") property(name="syslogfacility-text")
constant(value="\",\"programname\":\"") property(name="programname")
constant(value="\",\"procid\":\"") property(name="procid")
constant(value="\"}\n")
}
正如您可能猜到的那樣,對于每條傳入的消息,rsyslog 會将日志屬性插入到 JSON 格式的消息中,并将其轉發到 Logstash,監聽端口 10514。
重新啟動您的 rsyslog 服務,并驗證日志是否正确轉發到 ElasticSearch。
注意:日志将在名為 logstash-* 的索引中轉發。
$ sudo systemctl restart rsyslog
$ curl -XGET 'http://localhost:9200/logstash-*/_search?q=*&pretty'
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 10000,
"relation": "gte"
},
"max_score": 1,
"hits": [
{
"_index": "logstash-2019.07.08-000001",
"_type": "_doc",
"_id": "GEBK1WsBQwXNQFYwP8D_",
"_score": 1,
"_source": {
"host": "127.0.0.1",
"severity": "info",
"programname": "memory_usage",
"facility": "user",
"@timestamp": "2019-07-09T05:52:21.402Z",
"sysloghost": "schkn-ubuntu",
"message": " Dload Upload Total Spent Left Speed",
"@version": "1",
"procid": "16780",
"type": "rsyslog"
}
}
]
}
}
驚人的!我們知道 rsyslog 日志直接存儲在 ElasticSearch 中。
現在是我們在 Kibana 中建構最終儀表闆的時候了。
VI – 在 Kibana 中建構日志儀表闆
這就是樂趣的開始。
我們将建構第一部分中顯示的儀表闆,并為我們收集的資料賦予意義。
與我們關于Linux程序監控的文章類似,這部分是根據最終儀表闆的不同面闆進行拆分的,是以請随意跳轉到您感興趣的部分。
a – 關于 Kibana 的幾句話
前往 Kibana(在 http://localhost:5601 上),您應該會看到以下螢幕。
如果這是您第一次使用 Kibana,我想談談一個小問題,我花了一些時間才了解。
為了建立儀表闆,您需要建構可視化。Kibana 有兩個面闆,一個叫做“Visualize”,另一個叫做“Dashboard”
為了建立儀表闆,您将首先使用“可視化”面闆建立每個單獨的可視化并儲存它們。
當所有這些都建立完成後,您将它們一一導入到您的最終儀表闆中。
前往“可視化”面闆,讓我們從第一個面闆開始。
b – 流程的聚合條形圖
要建構您的第一個儀表闆,請單擊Kibana 右上角的“建立新的可視化”。選擇垂直條形面闆。
主要目标是建構一個如下所示的面闆:
如您所見,條形圖以聚合方式提供每個程序的日志總數。
如果您使用多個主機,條形圖也可以按主機拆分。
事不宜遲,這是此面闆的備忘單。
c – 按程式名稱進行餅圖
與我們之前所做的非常相似,目标是建構一個按程式名稱劃分日志比例的餅圖面闆。
這裡是這個面闆的備忘單!
d – 按嚴重程度劃分的餅圖
這個面闆看起來和我們之前做的完全一樣,除了它按嚴重性拆分日志。
當您的一個系統發生重大中斷時,它會非常有用,并且您想快速看到錯誤數量正在快速增加。
如果您有興趣檢視在夜間或特定事件發生的嚴重性,它還提供了一種簡單的方法來檢視給定時間段的日志嚴重性摘要。
同樣,您可能正在等待它,這是此面闆的備忘單!
e – 監控 SSH 條目
這個有點特别,因為您可以直接進入“發現”頁籤以建構您的面闆。
進入發現頁籤時,應自動選擇您的“logstash-*”。
從那裡,在過濾器欄中,輸入以下過濾器“programname:ssh*”。
如您所見,您現在可以直接通路與您機器上的 SSHd 服務相關的每個日志。例如,您可以跟蹤非法通路嘗試或錯誤登入。
為了在儀表闆面闆中可以通路它,請單擊“儲存”選項,并為您的面闆命名。
現在在儀表闆面闆中,您可以單擊“添加”,然後選擇剛剛建立的面闆。
好的!現在,您的面闆已包含在發現面闆中的儀表闆中。
VI – 結論
通過本教程,您可以更好地了解如何使用 Rsyslog 和 ELK 堆棧輕松監控整個日志記錄基礎架構。
使用本文中介紹的架構,您可以通過将日志轉發到中央伺服器來非常輕松地擴充整個叢集的日志監控。
一個建議是為您的 rsyslog 和 ELK 堆棧使用 Docker 映像,以便在日志數量增加過多時能夠擴充您的集中部分(例如使用 Kubernetes)。
同樣重要的是要注意,如果您選擇在将來更改螢幕的日志方式,這種架構是理想的。
您仍然可以依靠 rsyslog 進行日志集中,但您可以自由更改網關(在本例中為 Logstash)或可視化工具。
請務必注意,您可以使用 Grafana來非常輕松地監控您的 Elasticsearch 日志。
歡迎大家提出不一樣的觀點,我們一起讨論,
我是辣個男人,一個運維人。