部署ELK+Filebeat日志收集分析系統
需求背景:
- 業務發展越來越龐大,伺服器越來越多
- 各種通路日志、應用日志、錯誤日志量越來越多,導緻運維人員無法很好的去管理日志
- 開發人員排查問題,需要到伺服器上查日志,不友善
- 營運人員需要一些資料,需要我們運維到伺服器上分析日志
1、環境準備
1.1 環境規劃
環境準備的機器
IP位址 | 主機名 | 部署服務 |
---|---|---|
192.168.1.128 | es-01 | elasticsearch、kibana |
192.168.1.129 | es-02 | elasticsearch、logstash |
192.168.1.130 | es-03 | elasticsearch、filebeat |
架構圖
1.2 軟體版本下載下傳
注意:這邊根據實際情況
3台機器全部安裝jdk1.8,因為elasticsearch是java開發的
jdk 1.8.0_131
elasticsearch-7.13.2-linux-x86_64.tar.gz
kibana-7.13.2-linux-x86_64.tar.gz
logstash‐7.13.2‐linux‐x86_64.tar.gz
filebeat‐7.13.2‐linux‐x86_64.tar.gz
安裝包下載下傳
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.13.2-linux-x86_64.tar.gz
https://artifacts.elastic.co/downloads/kibana/kibana-7.13.2-linux-x86_64.tar.gz
https://artifacts.elastic.co/downloads/logstash/logstash-7.13.2-linux-x86_64.tar.gz
https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.13.2-linux-x86_64.tar.gz
2、部署ElasticSearch叢集
2.1 安裝ElasticSearch
三個節點都需安裝
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.13.2-linux-x86_64.tar.gz
tar zxf elasticsearch-7.13.2-linux-x86_64.tar.gz -C /usr/local/
mv /usr/local/elasticsearch-7.13.2 /usr/local/elasticsearch
2.1.1 配置es-01節點
[[email protected] ~]# grep '^[a-z]' /usr/local/elasticsearch/config/elasticsearch.yml
cluster.name: my-es
node.name: node-1
node.master: true
node.data: true
path.data: /data/elasticsearch/data
path.logs: /data/logs/elasticsearch
network.host: 192.168.1.128
http.port: 9200
discovery.seed_hosts: ["192.168.1.128","192.168.1.129","192.168.1.130"] #指定叢集成員,用于主動發現他們, 所有成員都要寫進來,包括自己,每個節點中應該寫一樣的資訊
cluster.initial_master_nodes: ["node-1"]
http.cors.enabled: true # 是否支援跨域,預設為false
http.cors.allow-origin: "*" # 當設定允許跨域,預設為*,表示支援所有域名,如果我們隻是允許某些網站能通路,那麼可以使用正規表達式。比如隻允許本地位址。 /https?:\/\/localhost(:[0-9]+)?/
2.1.2 配置es-02節點
隻是配置檔案中node.name、node.master和network.host不同,其他操作方式一緻
[[email protected] ~]# grep '^[a-z]' /usr/local/elasticsearch/config/elasticsearch.yml
cluster.name: my-es
node.name: node-2
node.master: false
node.data: true
path.data: /data/elasticsearch/data
path.logs: /data/logs/elasticsearch
network.host: 192.168.1.129
http.port: 9200
discovery.seed_hosts: ["192.168.1.128","192.168.1.129","192.168.1.130"]
cluster.initial_master_nodes: ["node-1"]
http.cors.enabled: true
http.cors.allow-origin: "*"
2.1.3 配置es-03節點
隻是配置檔案中node.name、node.master和network.host不同,其他操作方式一緻
[[email protected] ~]# grep '^[a-z]' /usr/local/elasticsearch/config/elasticsearch.yml
cluster.name: my-es
node.name: node-3
node.master: false
node.data: true
path.data: /data/elasticsearch/data
path.logs: /data/logs/elasticsearch
network.host: 192.168.1.130
http.port: 9200
discovery.seed_hosts: ["192.168.1.128","192.168.1.129","192.168.1.130"]
cluster.initial_master_nodes: ["node-1"]
http.cors.enabled: true
http.cors.allow-origin: "*"
2.2 建立目錄及使用者
三台機器都需建立
groupadd elastic && useradd elastic -g elastic -p elasticsearch
mkdir -p /data/elasticsearch/data /data/logs/elasticsearch
chown -R elastic:elastic /data/elasticsearch/data /data/logs/elasticsearch/ /usr/local/elasticsearch
2.3 啟動叢集ElasticSearch
su elastic -c "/usr/local/elasticsearch/bin/elasticsearch -d"
檢查叢集環境日志是否正常
2.4 檢視叢集狀态
[[email protected] ~]# curl "http://192.168.1.128:9200/_cluster/health?pretty"
{
"cluster_name" : "my-es",
"status" : "green", # 為green則代表健康沒問題,如果是yellow或者red則是叢集有問題
"timed_out" : false, # 是否有逾時
"number_of_nodes" : 3, # 叢集中的節點數量
"number_of_data_nodes" : 3, # 叢集中data節點的數量
"active_primary_shards" : 0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
檢查沒有問題後,我們的es叢集就搭建完成了,很簡單。
3、部署Kibana
3.1 安裝Kibana
[[email protected] ~]# https://artifacts.elastic.co/downloads/kibana/kibana‐7.13.2‐linux‐x86_64.tar.gz
[[email protected] ~]# tar zxf kibana-7.13.2-linux-x86_64.tar.gz -C /usr/local/
[[email protected] ~]# mv /usr/local/kibana-7.13.2-linux-x86_64/ /usr/local/kibana
3.2 配置主配置檔案
[[email protected] ~]# grep '^[a-z]' /usr/local/kibana/config/kibana.yml
server.port: 5601
server.host: "192.168.1.128" # 配置監聽ip
server.name: "elk-application"
elasticsearch.hosts: ["http://192.168.1.128:9200"] # # 配置es伺服器的ip,如果是叢集則配置該叢集中主節點的ip
logging.dest : /data/logs/kibana/kibana.log # 配置kibana的日志檔案路徑,不然預設是messages裡記錄日志
i18n.locale: "zh-CN" # 設定頁面的字型為中文
3.3 建立用于運作 kibana 的普通使用者
預設情況下, kibana 不允許使用 root 使用者運作,是以這裡建立一個普通使用者
[[email protected] ~]# groupadd kibana && useradd kibana -g kibana -p kibana
3.4 建立程式使用到的目錄并賦予權限
[[email protected] ~]# mkdir /data/logs/kibana /run/kibana
[[email protected] ~]# chown -R kibana:kibana /usr/local/kibana /data/logs/kibana/ /run/kibana
3.5 啟動kibana服務,并檢查程序和監聽端口
[[email protected] ~]# nohup su kibana -c "/usr/local/kibana/bin/kibana" &
[[email protected] ~]# ps aux|grep kibana
root 91686 0.0 0.1 191744 2340 pts/1 S 13:37 0:00 su kibana -c /usr/local/kibana/bin/kibana
kibana 91688 8.3 2.3 614116 44604 ? Ssl 13:37 0:00 /usr/local/kibana/bin/../node/bin/node /usr/local/kibana/bin/../src/cli/dist
kibana 91700 90.4 5.9 899460 111544 ? Rl 13:37 0:04 /usr/local/kibana/node/bin/node --preserve-symlinks-main --preserve-symlinks /usr/local/kibana/src/cli/dist
root 91716 0.0 0.0 112720 980 pts/0 S+ 13:37 0:00 grep --color=auto kibana
[[email protected] ~]# netstat -lntp |grep 5601
tcp 0 0 192.168.1.128:5601 0.0.0.0:* LISTEN 91700/node
注:由于kibana是使用node.js開發的,是以程序名稱為node
然後在浏覽器裡進行通路,如:
http://192.168.1.128:5601/
,由于我們并沒有安裝x-pack,是以此時是沒有使用者名和密碼的,可以直接通路的:
到此我們的kibana就安裝完成了,很簡單,接下來就是安裝logstash,不然kibana是沒法用的。
4、部署Filebeat
4.1 Filebeat 安裝
[[email protected] ~]# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.13.2-linux-x86_64.tar.gz
[[email protected] ~]# tar zxf filebeat-7.13.2-linux-x86_64.tar.gz -C /usr/local/
[[email protected] ~]# mv /usr/local/filebeat-7.13.2-linux-x86_64/ /usr/local/filebeat
Filebeat啟動管理
1.前台運作
采用前台運作的方式檢視 Filebeat 擷取的日志結果
2.背景運作
使用 nohup 方式啟動 Filebeat 到背景 ,日志結果可檢視 nohup.out 檔案
使用 systemd 管理的背景方式啟動 Filebeat 程序不能檢視輸出日志,測試階段誤用
配置 systemd 方式的 Filebeat 啟動管理檔案
[[email protected] filebeat]# vim /usr/lib/systemd/system/filebeat.service
[Unit]
Description=Filebeat sends log files to Logstash or directly to Elasticsearch.
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml
Restart=always
[Install]
WantedBy=multi-user.target
[[email protected] filebeat]# systemctl daemon-reload
[[email protected] filebeat]# systemctl start filebeat
4.2 Filebeat 簡單使用
準備測試資料
94.16.136.28 - - [04/Jun/2021:16:28:22 +0800] "POST /captcha/getPic HTTP/1.1" "-" 200 22062 "https://xxx.com/index" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/90.0.443
0.212 Safari/537.36" "-" "192.168.0.75:1800" "0.090" 0.090
配置 Filebeat 的輸入和輸出
[[email protected]-03 ~]# cat /usr/local/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /data/logs/nginx/*.log # 指定需要收集日志的路徑,支援通配符可以寫多個
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml # 内置的收集日志的子產品配置檔案的存放路徑
reload.enabled: false # 當子產品的配置檔案有更新時,此程式是否要自動加載, false 不加載, true 加載
setup.template.settings:
index.number_of_shards: 1
output.logstash: # 輸出到 logstash
hosts: ["192.168.1.129:5044"]
processors:
- add_host_metadata: # 添加此主機的源資料資訊到輸出資料中,比如 IP MAC OS 等資訊
when.not.contains.tags: forwarded
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~
運作觀察日志輸出
找不到配置檔案可使用
-c
指定配置檔案位置
[[email protected] ~]# /usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml
Filebeat 程序日志
filebeat 本身運作日志預設位置 /usr/local/filebeat/logs/filebeat
要修改 Filebeat 的日志路徑,可以添加如下内容在配置檔案 filebeat.yml 中實作
# ================================== Logging ===================================
# Sets log level. The default log level is info.
# Available log levels are: error, warning, info, debug
#logging.level: debug
path.logs: /var/log/ # 添加此行即可
這樣設定後, filebeat 啟動後,日志的目錄是 /var/log/ , 日志的檔案名為 filebeat , 每次啟動或者重新開機程式會生
成一個新的日志檔案 filebeat , 舊的日志命名為 filebeat.1 依次類推。
4.3 專用日志搜集子產品
檢視可啟用的子產品清單
[[email protected] ~]# /usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml modules list
Enabled:
nginx
Disabled:
activemq
apache
auditd
子產品配置檔案存儲位置
[[email protected] modules.d]# pwd
/usr/local/filebeat/modules.d
[[email protected] modules.d]# ls
......
禁用子產品
[[email protected] modules.d]# /usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml modules disable 子產品名
啟用子產品
[[email protected] modules.d]# /usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml modules enable 子產品名
情景 1:使用子產品預設的日志路徑
修改
modules.d/nginx.yml
檔案内容如下:
‐ module: nginx
access:
enabled: true
error:
enabled: true
nginx 子產品搜集日志的預設路徑是 :
/var/log/nginx/access.log*
/var/log/nginx/error.log*
情景 2:使用非預設路徑(适用于所有的子產品)
假如所要搜集的日志真實路徑和日志收集子產品預設的路徑不一緻,可以配置
var.paths:
屬性進行配置。
var.paths
接收的值是一個包含一個以上的日志絕對路徑清單。接收的值是一個數組
用于給日志檔案設定自定義路徑的。如果不設定此選項, Filebeat 将根據您的作業系統選擇路徑選擇使用預設值
可以使用如下方式配置:
‐ module: nginx
access:
enabled: true
var.paths: ["/data/nginx/log/nginx/access.log*", "/data/nginx/log/error.log*"]
或者下面的方式 :
‐ module: nginx
access:
enabled: true
var.paths:
‐ "/data/nginx/log/nginx/access.log*"
‐ "/data/nginx/log/error.log*"
⚠ 注意:
var.paths
指定的路徑,是以追加的方式和子產品預設路徑合并到一起的,也就是說假如子產品的預設路徑有
具體的日志檔案
/var/log/nginx/access.log
。 這裡 var.paths 也配置了路徑
/tmp/accesslog
,那麼最終
Filebeat 收集的日志路徑将會是 :
- /var/log/nginx/access.log
- /tmp/accesslog
測試:調用子產品進行測試:
./filebeat -e
配置 output
Filebeat 是用于搜集日志,之後把日志推送到某個接收的系統中的,這些系統或者裝置在 Filebeat 中稱為
output
output 類型 :
- console 終端螢幕
- elasticsearch 存放日志,并提供查詢
- logstash 進一步對日志資料進行處理
- kafka 消息隊列
⚠ filebeat 運作的時候,以上的 output 隻可配置其中的一種。
具體配置方式是編輯主配置檔案 :
/usr/local/filebeat/filebeat.yml
注意:注釋掉其他的 output
輸出到 console
輸出完整 JSON 資料
‐ module: nginx
access:
enabled: true
var.paths: ["/data/nginx/log/nginx/access.log*", "/data/nginx/log/error.log*"]
==========================================================
‐ module: nginx
access:
enabled: true
var.paths:
‐ "/data/nginx/log/nginx/access.log*"
‐ "/data/nginx/log/error.log*"
output.console:
pretty: true
進入到 filebeat 的安裝目錄下,執行指令前台運作
./filebeat
如果隻想輸出完整 Json 資料中的某些字段
output.console:
codec.format:
string: '%{[@timestamp]} %{[message]}'
其他輸出目标:
輸出到 elasticsearch
output.elasticsearch:
hosts: ['http://192.168.1.128:9200', 'http://192.168.1.129:9200']
輸出到 logstash
output.logstash:
hosts: ["192.168.1.129:5044"]
5、部署Logstash
5.1 安裝logstash
[[email protected] ~]# wget https://artifacts.elastic.co/downloads/logstash/logstash-7.13.2-linux-x86_64.tar.gz
[[email protected] ~]# tar zxf logstash-7.13.2-linux-x86_64.tar.gz -C /usr/local/
[[email protected] ~]# mv /usr/local/logstash-7.13.2/ /usr/local/logstash
5.2 測試運作
運作最基本的 Logstash 管道來測試 Logstash 安裝。
Logstash 管道具有兩個必需元素 input 和output ,以及一個可選元素 filter 。輸入插件使用來自源的資料,過濾器插件根據你的指定修改資料,輸出插件将資料寫入目标。
進入 Logstash 的安裝主目錄下執行:
[[email protected] logstash]# ./bin/logstash -e ""
-e 選項用于設定 Logstash 處理資料的輸入和輸出
-e '' 等同于 -e input { stdin { type => stdin } } output { stdout { codec => rubydebug } }
input { stdin { type => stdin } }
表示 Logstash 需要處理的資料來源來自于标準輸入裝置
output { stdout { codec => rubydebug } }
表示 Logstash 把處理好的資料輸出到标準輸出裝置
稍等片刻,當看到螢幕上輸出如下字樣,即可嘗試使用鍵盤輸入 hello 字樣
[2021-08-15T07:37:10,525][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
輸入 hello 即會立刻輸出配格式化後的資料資訊
-
字段對應的值是 Logstash 接收到的一行完整的資料message
-
是版本資訊,可以用于建立索引使用@version
-
處理此資料的時間戳,可以用于建立索引和搜尋@timestamp
-
就是之前type
中設定的值,這個值可以任意修改,但是, type 是内置的變量,不能修改,用于建立索引和條件判斷等input
-
表示從那個主機過來的資料hosts
5.3 配置輸入和輸出
生産中, Logstash 管道要複雜一些:它通常具有一個或多個輸入,過濾器和輸出插件。
本部分中,将建立一個 Logstash 管道,該管道使用标準輸入來擷取 Apache Web 日志作為輸入,解析這些日志以從
日志中建立特定的命名字段,然後将解析的資料輸出到标準輸出(螢幕上)。并且這次無需在指令行上定義管道配
置,而是在配置檔案中定義管道。
建立任意一個檔案,并寫入如下内容,作為 Logstash 的管道配置檔案
[[email protected] logstash]# vim /usr/local/logstash/config/first -pipeline.conf
input {
stdin { }
}
output {
stdout {}
}
配置檔案文法測試
bin/logstash ‐f config/first‐pipeline.conf ‐‐config.test_and_exit
或
-t
- -f 用于指定管道配置檔案。
運作如下指令啟動 Logstash
[[email protected] logstash]# bin/logstash ‐f config/first‐pipeline.conf
啟動後複制如下内容到指令行中,并按下Enter鍵
使用 Grok 過濾器插件解析 Web 日志
現在有了一個工作管道,但是日志消息的格式不是理想的。你想解析日志消息 ,以便能從日志中建立特定的命名字段。為此,應該使用 grok 過濾器插件。
使用 grok 過濾器插件,可以将非結構化日志資料解析為結構化和可查詢的内容。
grok 會根據你感興趣的内容配置設定字段名稱,并把這些内容和對應的字段名稱進行綁定。
這裡使用的模式是
%{COMBINEDAPACHELOG}
{COMBINEDAPACHELOG
使用以下模式從 Nginx 日志中構造行:
并且這裡要想實作修改配置檔案之後自動加載它,不能配置
input
為
stdin
。 是以, 這裡使用了
file
,建立示例日志檔案
56.32.126.78 - - [04/Jun/2021:16:28:22 +0800] "POST /a/gsg HTTP/1.1" "-" 200 22062 "https://xxxx.com/index" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/90.0.4430.212 Safari/537.36" "-" "192.168.0.75:1820" "0.090" 0.090
修改好的管道配置檔案如下:
[[email protected] logstash]# vim config/first-pipeline.conf
input {
file {
path => ["/data/logs/nginx/access.log"]
start_position => "beginning"
}
}
filter {
grok { # 對 web 日志進行過濾處理,輸出結構化的資料
# 在 message 字段對應的值中查詢比對上 COMBINEDAPACHELOG
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
}
output {
stdout {}
}
match => { "message" => "%{COMBINEDAPACHELOG}"}
的意思是: 當比對到 “message” 字段時,使用者模式
"COMBINEDAPACHELOG}"
進行字段映射。
配置完成後,再次進行驗證
[[email protected] logstash]# ./bin/logstash -f config/first-pipeline.conf
下面輸出的内容
會發現原來的非結構化資料,變為結構化的資料了。
原來的 message 字段仍然存在,假如你不需要它,可以使用 grok 中提供的常用選項之一:
remove_filed 來移除這個字段。 remove_field 可以移除任意的字段,它可以接收的值是一個數組。
rename 可以重新命名字段
修改後管道配置檔案如下:
[[email protected] logstash]# cat /usr/local/logstash/config/first-pipeline.conf
input {
file {
path => ["/data/logs/nginx/access.log"]
start_position => "beginning"
}
}
filter {
grok { match => { "message" => "%{COMBINEDAPACHELOG}"} }
# 重寫字段
mutate { rename => { "clientip" => "cip" } }
# 去掉沒用字段
mutate { remove_field => ["message","input_type","@version","@timestamp"] }
}
output {
stdout {}
}
增加新日志,再次測試,你會發現 message 不見了 ,而且 clientip 重命名成了 cip :
5.4 配置logstash從filebeat 讀取資料存儲到es叢集
[[email protected]-02 logstash]# cat config/first-pipeline.conf
input {
# file {
# path => ["/data/logs/nginx/access.log"]
# start_position => "beginning"
# }
beats {
port => 5044
}
}
filter {
grok { match => { "message" => "%{COMBINEDAPACHELOG}"} }
# mutate { rename => { "clientip" => "cip" } }
# mutate { remove_field => ["message","input_type","@version","@timestamp"] }
}
output {
stdout {
codec => rubydebug
}
if [log][file][path] == "/data/logs/nginx/access.log" {
elasticsearch {
hosts => ["192.168.1.128:9200","192.168.1.129:9200","192.168.1.130:9200"]
index => "%{[host][hostname]}‐nginx‐access-%{+YYYY.MM.dd}"
codec => "json"
}
} else if [log][file][path] == "/data/logs/nginx/error.log" {
elasticsearch {
hosts => ["192.168.1.128:9200","192.168.1.129:9200","192.168.1.130:9200"]
index => "%{[host][hostname]}‐nginx‐error-%{+YYYY.MM.dd}"
codec => "json"
}
}
}
5.5 啟動logstash并觀察日志
[[email protected] logstash]# ./bin/logstash -f config/first-pipeline.conf --config.reload.automatic
觀察日志的輸出,已經從filebeat讀取了資料并存到了es叢集中
5.6 檢視elasticsearch叢集是否增加了對應的索引庫
es叢集已經生成了es-03‐nginx‐error-2021.08.23及es-03‐nginx‐access-2021.08.23索引庫
到此為止logstash已經成功從filebeat讀取到日志資料,然後傳入到elasticsearch叢集不同的索引庫
6、在kibana上關聯elasticsearch索引庫浏覽日志資料
6.1 在kibana上添加nginx-access索引模式
使用浏覽器通路 http://ip:5601
6.1.1 建立索引模式
6.1.2 填寫索引名
6.1.3 添加一個時間篩選字段
6.1.4 建立成功
6.2 查詢nginx-access索引日志資料
參考:文章