Elastic 的一篇文章
介紹
理解組織生成的數(shù)百萬(wàn)條日志行可能是一個(gè)艱巨的挑戰(zhàn)。一方面,這些日志行提供了對(duì)應(yīng)用程序性能、服務(wù)器性能指標(biāo)和安全性的視圖。另一方面,日志管理和分析可能非常耗時(shí),這可能會(huì)阻礙對(duì)這些日益必要的服務(wù)的采用。
開源軟件,如 rsyslog、Elasticsearch 和 Logstash 提供了傳輸、轉(zhuǎn)換和存儲(chǔ)日志數(shù)據(jù)的工具。
在本教程中,您將學(xué)習(xí)如何創(chuàng)建一個(gè)集中的 rsyslog 服務(wù)器,以存儲(chǔ)來(lái)自多個(gè)系統(tǒng)的日志文件,然后使用 Logstash 將它們發(fā)送到 Elasticsearch 服務(wù)器。然后,您可以決定如何最好地分析數(shù)據(jù)。
目標(biāo)
本教程教會(huì)您如何集中存儲(chǔ)由 syslog 生成或接收的日志,特別是被稱為 rsyslog 的變體。Syslog 和基于 syslog 的工具如 rsyslog 從內(nèi)核和許多運(yùn)行以保持類 UNIX 服務(wù)器運(yùn)行的程序中收集重要信息。由于 syslog 是一個(gè)標(biāo)準(zhǔn),而不僅僅是一個(gè)程序,許多軟件項(xiàng)目都支持向 syslog 發(fā)送數(shù)據(jù)。通過集中存儲(chǔ)這些數(shù)據(jù),您可以更輕松地審計(jì)安全性,監(jiān)視應(yīng)用程序行為,并跟蹤其他重要的服務(wù)器信息。
從一個(gè)集中或聚合的 rsyslog 服務(wù)器,您可以將數(shù)據(jù)轉(zhuǎn)發(fā)到 Logstash,它可以在將數(shù)據(jù)發(fā)送到 Elasticsearch 之前進(jìn)一步解析和豐富您的日志數(shù)據(jù)。
本教程的最終目標(biāo)是:
- 設(shè)置一個(gè)單一的客戶端(或轉(zhuǎn)發(fā))rsyslog 服務(wù)器
- 設(shè)置一個(gè)單一的服務(wù)器(或收集)rsyslog 服務(wù)器,以接收來(lái)自 rsyslog 客戶端的日志
- 設(shè)置一個(gè) Logstash 實(shí)例,以接收來(lái)自 rsyslog 收集服務(wù)器的消息
- 設(shè)置一個(gè) Elasticsearch 服務(wù)器,以接收來(lái)自 Logstash 的數(shù)據(jù)
先決條件
在相同的 DigitalOcean 數(shù)據(jù)中心中,創(chuàng)建以下啟用了私有網(wǎng)絡(luò)的 Droplets:
- 名為 rsyslog-client 的 Ubuntu 14.04 Droplet
- 名為 rsyslog-server 的 Ubuntu 14.04 Droplet(1 GB 或更大),用于存儲(chǔ)集中日志和安裝 Logstash
- 安裝了 Elasticsearch 的 Ubuntu 14.04 Droplet,安裝方法請(qǐng)參考《在 Ubuntu 14.04 上安裝和配置 Elasticsearch》
您還需要為每個(gè)服務(wù)器創(chuàng)建一個(gè)具有 sudo 權(quán)限的非 root 用戶?!妒褂?Ubuntu 14.04 進(jìn)行初始服務(wù)器設(shè)置》解釋了如何設(shè)置這一點(diǎn)。
參考《如何設(shè)置和使用 DigitalOcean 私有網(wǎng)絡(luò)》以獲取有關(guān)在創(chuàng)建 Droplets 時(shí)啟用私有網(wǎng)絡(luò)的幫助。
如果您在沒有啟用私有網(wǎng)絡(luò)的情況下創(chuàng)建了 Droplets,請(qǐng)參考《如何在現(xiàn)有 Droplets 上啟用 DigitalOcean 私有網(wǎng)絡(luò)》。
步驟 1 —— 確定私有 IP 地址
在本節(jié)中,您將確定每個(gè) Droplet 分配了哪些私有 IP 地址。這些信息將在整個(gè)教程中需要。
在每個(gè) Droplet 上,使用 ifconfig
命令找到其 IP 地址:
sudo ifconfig -a
使用 -a
選項(xiàng)顯示所有接口。主要以太網(wǎng)接口通常稱為 eth0
。但在這種情況下,我們需要來(lái)自 eth1
的 IP,即 私有 IP 地址。這些私有 IP 地址在互聯(lián)網(wǎng)上不可路由,并且用于在私有 LAN 中進(jìn)行通信 — 在這種情況下,是在同一數(shù)據(jù)中心中啟用了次要接口的服務(wù)器之間。
輸出將類似于:
eth0 Link encap:Ethernet HWaddr 04:01:06:a7:6f:01
inet addr:123.456.78.90 Bcast:123.456.78.255 Mask:255.255.255.0
inet6 addr: fe80::601:6ff:fea7:6f01/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:168 errors:0 dropped:0 overruns:0 frame:0
TX packets:137 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:18903 (18.9 KB) TX bytes:15024 (15.0 KB)
eth1 Link encap:Ethernet HWaddr 04:01:06:a7:6f:02
inet addr:10.128.2.25 Bcast:10.128.255.255 Mask:255.255.0.0
inet6 addr: fe80::601:6ff:fea7:6f02/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6 errors:0 dropped:0 overruns:0 frame:0
TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:468 (468.0 B) TX bytes:398 (398.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
這里需要注意的部分是 eth1
和其中的 inet addr
。在這種情況下,私有網(wǎng)絡(luò)地址是 10.128.2.25。這個(gè)地址只能從啟用了私有網(wǎng)絡(luò)的同一區(qū)域內(nèi)的其他服務(wù)器訪問。
請(qǐng)確保對(duì)所有 3 個(gè) Droplets 都重復(fù)此步驟。將這些私有 IP 地址保存在安全的地方。它們將在整個(gè)教程中使用。
步驟 2 —— 設(shè)置 Elasticsearch 的綁定地址
作為先決條件,您在單獨(dú)的 Droplet 上設(shè)置了 Elasticsearch?!对?Ubuntu 14.04 上安裝和配置 Elasticsearch》教程向您展示了如何將綁定地址設(shè)置為 localhost
,以便其他服務(wù)器無(wú)法訪問該服務(wù)。然而,我們需要更改這一設(shè)置,以便 Logstash 可以通過其專用網(wǎng)絡(luò)地址向其發(fā)送數(shù)據(jù)。
我們將 Elasticsearch 綁定到其專用 IP 地址。Elasticsearch 只會(huì)監(jiān)聽對(duì)該 IP 地址的請(qǐng)求。
在 Elasticsearch 服務(wù)器上,編輯配置文件:
sudo nano /etc/elasticsearch/elasticsearch.yml
找到包含 network.bind_host
的行。如果它被注釋掉了,通過刪除行首的 #
字符來(lái)取消注釋。將值更改為 Elasticsearch 服務(wù)器的專用 IP 地址,使其看起來(lái)像這樣:
network.bind_host: private_ip_address
最后,重新啟動(dòng) Elasticsearch 以啟用更改。
sudo service elasticsearch restart
步驟 3 —— 配置中心服務(wù)器以接收數(shù)據(jù)
在本節(jié)中,我們將配置 rsyslog-server Droplet 為能夠從其他 syslog 服務(wù)器在 514 端口接收數(shù)據(jù)的 中心 服務(wù)器。
要配置 rsyslog-server 以從其他 syslog 服務(wù)器接收數(shù)據(jù),請(qǐng)編輯 rsyslog-server Droplet 上的 /etc/rsyslog.conf
:
sudo nano /etc/rsyslog.conf
找到您的 rsyslog.conf
中已經(jīng)注釋掉的這些行:
# provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514
# provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
每個(gè)部分的第一行($ModLoad imudp
和 $ModLoad imtcp
)分別加載 imudp
和 imtcp
模塊。imudp
代表 input module udp,imtcp
代表 input module tcp。這些模塊監(jiān)聽來(lái)自其他 syslog 服務(wù)器的傳入數(shù)據(jù)。
每個(gè)部分的第二行($UDPSerververRun 514
和 $TCPServerRun 514
)指示 rsyslog 應(yīng)啟動(dòng)分別監(jiān)聽端口 514(這是 syslog 的默認(rèn)端口)的 UDP 和 TCP 服務(wù)器。
要啟用這些模塊和服務(wù)器,請(qǐng)取消注釋這些行,使文件現(xiàn)在包含:
# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
保存并關(guān)閉 rsyslog 配置文件。
通過運(yùn)行以下命令重新啟動(dòng) rsyslog:
sudo service rsyslog restart
您的中心 rsyslog 服務(wù)器現(xiàn)在已配置為監(jiān)聽來(lái)自遠(yuǎn)程 syslog(包括 rsyslog)實(shí)例的消息。
步驟 4 —— 配置 rsyslog 以遠(yuǎn)程發(fā)送數(shù)據(jù)
在本節(jié)中,我們將配置 rsyslog-client 以將日志數(shù)據(jù)發(fā)送到我們?cè)谏弦徊街信渲玫?ryslog-server Droplet。
在 Ubuntu 上的默認(rèn) rsyslog 設(shè)置中,您會(huì)在 /etc/rsyslog.d
中找到兩個(gè)文件:
20-ufw.conf
50-default.conf
在 rsyslog-client 上,編輯默認(rèn)配置文件:
sudo nano /etc/rsyslog.d/50-default.conf
在 log by facility
部分之前的文件頂部添加以下行,將 private_ip_of_ryslog_server
替換為您 中心 服務(wù)器的私有 IP:
*.* @private_ip_of_ryslog_server:514
保存并退出文件。
行的第一部分(.)表示我們要發(fā)送所有消息。雖然這超出了本教程的范圍,但您可以配置 rsyslog 僅發(fā)送某些消息。行的其余部分解釋了如何發(fā)送數(shù)據(jù)以及發(fā)送數(shù)據(jù)的位置。在我們的情況下,@
符號(hào)表示 rsyslog 使用 UDP 發(fā)送消息。將其更改為 @@
以使用 TCP。然后是安裝有 rsyslog 和 Logstash 的 rsyslog-server 的私有 IP 地址。冒號(hào)后面的數(shù)字是要使用的端口號(hào)。
重新啟動(dòng) rsyslog 以啟用更改:
sudo service rsyslog restart
恭喜!您現(xiàn)在正在將您的 syslog 消息發(fā)送到一個(gè)中心服務(wù)器!
步驟 5 —— 將日志數(shù)據(jù)格式化為 JSON
Elasticsearch 要求其接收的所有文檔都以 JSON 格式提供,而 rsyslog 提供了一種通過模板實(shí)現(xiàn)這一點(diǎn)的方法。
在本步驟中,我們將配置我們的中心 rsyslog 服務(wù)器以使用 JSON 模板在將數(shù)據(jù)發(fā)送到 Logstash 之前格式化日志數(shù)據(jù),然后由 Logstash 將其發(fā)送到另一臺(tái)服務(wù)器上的 Elasticsearch。
回到 rsyslog-server 服務(wù)器,在發(fā)送到 Logstash 之前創(chuàng)建一個(gè)新的配置文件以將消息格式化為 JSON 格式:
sudo nano /etc/rsyslog.d/01-json-template.conf
將以下內(nèi)容精確復(fù)制到文件中:
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")
}
除了第一行和最后一行外,注意到此模板生成的行在開頭有一個(gè)逗號(hào)。這是為了保持 JSON 結(jié)構(gòu) 和 幫助保持文件的可讀性。此模板將按照 Elasticsearch 和 Logstash 期望接收的方式格式化您的消息。它們將如下所示:
{
"@timestamp" : "2015-11-18T18:45:00Z",
"@version" : "1",
"message" : "Your syslog message here",
"sysloghost" : "hostname.example.com",
"severity" : "info",
"facility" : "daemon",
"programname" : "my_program",
"procid" : "1234"
}
發(fā)送的數(shù)據(jù)尚未使用此格式。下一步顯示了如何配置服務(wù)器以使用此模板文件。
第六步 —— 配置集中式服務(wù)器發(fā)送到 Logstash
現(xiàn)在我們已經(jīng)有了定義正確 JSON 格式的模板文件,讓我們配置集中式 rsyslog 服務(wù)器將數(shù)據(jù)發(fā)送到 Logstash,在本教程中 Logstash 與其在同一臺(tái) Droplet 上。
在啟動(dòng)時(shí),rsyslog 將查看 /etc/rsyslog.d
中的文件并從中創(chuàng)建其配置。讓我們添加自己的配置文件來(lái)擴(kuò)展配置。
在 rsyslog-server 上,創(chuàng)建 /etc/rsyslog.d/60-output.conf
:
sudo nano /etc/rsyslog.d/60-output.conf
將以下行復(fù)制到此文件中:
# 此行將所有行發(fā)送到指定 IP 地址的 10514 端口,
# 使用 "json-template" 格式模板
*.* @private_ip_logstash:10514;json-template
開頭的 *.*
表示處理所有日志消息的其余部分。@
符號(hào)表示使用 UDP(使用 @@
來(lái)使用 TCP)。@
后面的 IP 地址或主機(jī)名是要轉(zhuǎn)發(fā)消息的地方。在我們的情況下,由于 rsyslog 集中式服務(wù)器和 Logstash 服務(wù)器都安裝在同一臺(tái) Droplet 上,我們使用 rsyslog-server 的私有 IP 地址。這必須與您在下一步中配置 Logstash 監(jiān)聽的私有 IP 地址相匹配。
接下來(lái)是端口號(hào)。本教程使用端口 10514。請(qǐng)注意,Logstash 服務(wù)器必須使用相同的協(xié)議在相同的端口上監(jiān)聽。最后一部分是我們的模板文件,顯示了如何在傳遞數(shù)據(jù)之前格式化數(shù)據(jù)。
不要立即重新啟動(dòng) rsyslog。首先,我們必須配置 Logstash 來(lái)接收消息。
第七步 —— 配置 Logstash 接收 JSON 消息
在此步驟中,您將安裝 Logstash,配置它以從 rsyslog 接收 JSON 消息,并配置它將 JSON 消息發(fā)送到 Elasticsearch。
Logstash 需要 Java 7 或更高版本。使用 Elasticsearch 教程的 第一步 中的說(shuō)明在 rsyslog-server Droplet 上安裝 Java 7 或 8。
接下來(lái),安裝 Logstash 存儲(chǔ)庫(kù)的安全密鑰:
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
將存儲(chǔ)庫(kù)定義添加到您的 /etc/apt/sources.list
文件中:
echo "deb http://packages.elastic.co/logstash/2.3/debian stable main" | sudo tee -a /etc/apt/sources.list
更新軟件包列表以包括 Logstash 存儲(chǔ)庫(kù):
sudo apt-get update
最后,安裝 Logstash:
sudo apt-get install logstash
現(xiàn)在 Logstash 已安裝,讓我們配置它以監(jiān)聽來(lái)自 rsyslog 的消息。
Logstash 的默認(rèn)安裝在 /etc/logstash/conf.d
中查找配置文件。編輯主配置文件:
sudo nano /etc/logstash/conf.d/logstash.conf
然后,在 /etc/logstash/conf.d/logstash.conf
中添加以下行:
# 此輸入塊將在端口 10514 上監(jiān)聽日志。
# 主機(jī)應(yīng)該是 Logstash 服務(wù)器上的一個(gè) IP。
# codec => "json" 表示我們期望接收的行是 JSON 格式的
# type => "rsyslog" 是一個(gè)可選標(biāo)識(shí)符,用于幫助識(shí)別管道中的消息流。
input {
udp {
host => "logstash_private_ip"
port => 10514
codec => "json"
type => "rsyslog"
}
}
# 這是一個(gè)空的過濾器塊。您可以稍后在這里添加其他過濾器以進(jìn)一步處理
# 您的日志行
filter { }
# 此輸出塊將發(fā)送所有類型為 "rsyslog" 的事件到配置的 Elasticsearch
# 主機(jī)和端口,進(jìn)入每日索引的模式,"rsyslog-YYYY.MM.DD"
output {
if [type] == "rsyslog" {
elasticsearch {
hosts => [ "elasticsearch_private_ip:9200" ]
}
}
}
syslog 協(xié)議從定義上是 UDP,因此此配置反映了該標(biāo)準(zhǔn)。
在輸入塊中,通過將 logstash_private_ip 替換為 rsyslog-server 的私有 IP 地址來(lái)設(shè)置 Logstash 主機(jī)地址,該服務(wù)器也安裝有 Logstash。
輸入塊配置 Logstash 監(jiān)聽端口 10514
,因此它不會(huì)與同一臺(tái)機(jī)器上的 syslog 實(shí)例競(jìng)爭(zhēng)。小于 1024 的端口需要以 root 用戶身份運(yùn)行 Logstash,這不是一個(gè)良好的安全實(shí)踐。
確保將 elasticsearch_private_ip 替換為您的 Elasticsearch Droplet 的私有 IP 地址。輸出塊顯示了一個(gè)簡(jiǎn)單的條件配置。它的目的是只允許匹配的事件通過。在這種情況下,只有具有 “type” 為 “rsyslog” 的事件。
測(cè)試您的 Logstash 配置更改:
sudo service logstash configtest
如果沒有語(yǔ)法錯(cuò)誤,它應(yīng)該顯示 Configuration OK
。否則,請(qǐng)嘗試閱讀錯(cuò)誤輸出,查看您的 Logstash 配置有什么問題。
完成所有這些步驟后,您可以通過運(yùn)行以下命令啟動(dòng) Logstash 實(shí)例:
sudo service logstash start
還要重新啟動(dòng)同一臺(tái)服務(wù)器上的 rsyslog,因?yàn)樗F(xiàn)在有一個(gè)要轉(zhuǎn)發(fā)的 Logstash 實(shí)例:
sudo service rsyslog restart
要驗(yàn)證 Logstash 是否在端口 10514 上監(jiān)聽:
netstat -na | grep 10514
您應(yīng)該會(huì)看到類似以下內(nèi)容:
udp6 0 0 10.128.33.68:10514 :::*
您將看到 rsyslog-server 的私有 IP 地址和我們用于監(jiān)聽 rsyslog 數(shù)據(jù)的 10514 端口號(hào)。
第八步 — 驗(yàn)證 Elasticsearch 輸入
在之前的步驟中,我們配置了 Elasticsearch 監(jiān)聽其私有 IP 地址。現(xiàn)在它應(yīng)該正在接收來(lái)自 Logstash 的消息。在這一步中,我們將驗(yàn)證 Elasticsearch 是否正在接收日志數(shù)據(jù)。
rsyslog-client 和 rsyslog-server Droplets 應(yīng)該將它們所有的日志數(shù)據(jù)發(fā)送到 Logstash,然后傳遞到 Elasticsearch。讓我們生成一個(gè)安全消息來(lái)驗(yàn)證 Elasticsearch 是否確實(shí)收到了這些消息。
在 rsyslog-client 上,執(zhí)行以下命令:
sudo tail /var/log/auth.log
您將在輸出的末尾看到本地系統(tǒng)上的安全日志。它看起來(lái)類似于:
May 2 16:43:15 rsyslog-client sudo: sammy : TTY=pts/0 ; PWD=/etc/rsyslog.d ; USER=root ; COMMAND=/usr/bin/tail /var/log/auth.log
May 2 16:43:15 rsyslog-client sudo: pam_unix(sudo:session): session opened for user root by sammy(uid=0)
通過簡(jiǎn)單的查詢,您可以檢查 Elasticsearch:
在 Elasticsearch 服務(wù)器上或任何被允許訪問它的系統(tǒng)上運(yùn)行以下命令。將 elasticsearch_ip 替換為 Elasticsearch 服務(wù)器的私有 IP 地址。這個(gè) IP 地址也必須是您在本教程中早些時(shí)候配置 Elasticsearch 監(jiān)聽的 IP 地址。
curl -XGET 'http://elasticsearch_ip:9200/_all/_search?q=*&pretty'
在輸出中,您將看到類似以下內(nèi)容:
{
"_index" : "logstash-2016.05.04",
"_type" : "rsyslog",
"_id" : "AVR8fpR-e6FP4Elp89Ww",
"_score" : 1.0,
"_source":{"@timestamp":"2016-05-04T15:59:10.000Z","@version":"1","message":" sammy : TTY=pts/0 ; PWD=/home/sammy ; USER=root ; COMMAND=/usr/bin/tail /var/log/auth.log","sysloghost":"rsyslog-client","severity":"notice","facility":"authpriv","programname":"sudo","procid":"-","type":"rsyslog","host":"10.128.33.68"}
},
請(qǐng)注意,生成 rsyslog 消息的 Droplet 的名稱在日志中(rsyslog-client)。
通過這個(gè)簡(jiǎn)單的驗(yàn)證步驟,您的集中式 rsyslog 設(shè)置已經(jīng)完成并且完全可操作!
結(jié)論
您的日志現(xiàn)在存儲(chǔ)在 Elasticsearch 中。接下來(lái)呢?考慮閱讀一下 Kibana 能做什么,以可視化您在 Elasticsearch 中的數(shù)據(jù),包括線條圖、柱狀圖、餅圖、地圖等?!度绾卧?Ubuntu 14.04 上使用 Logstash 和 Kibana 實(shí)現(xiàn)日志集中化》解釋了如何使用 Kibana web 界面來(lái)搜索和可視化日志。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-847681.html
也許您的數(shù)據(jù)通過進(jìn)一步解析和標(biāo)記化會(huì)更有價(jià)值。如果是這樣,那么學(xué)習(xí)更多關(guān)于 Logstash 的知識(shí)將有助于您實(shí)現(xiàn)這一結(jié)果。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-847681.html
到了這里,關(guān)于如何在 Ubuntu 14.04 上使用 Rsyslog、Logstash 和 Elasticsearch 實(shí)現(xiàn)日志集中管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!