Elastic日誌系統-filebeat-redis-logstash-elasticsearch-kibana-6.8.0搭建流程
搭建步驟
1. 需要準備的環境
系統環境
主機 | 軟件 |
---|---|
192.168.100.104 | elasticsearch, es-head, redis, logstash |
192.168.100.105 | filebeat, elasticsearch |
192.168.100.106 | elasticsearch, kibana, filebeat |
系統版本:
CentOS Linux release 7.7.1908 (Core)
1.1 軟件版本
elastic系列爲6.8.0
版本,使用rpm
包安裝,簡單,方便管理。
1.2 軟件安裝
elastic系列軟件下載地址:https://www.elastic.co/cn/downloads/past-releases
這個地址可以下載各個版本的elastic系列軟件包。
點擊下載
elasticsearch下載
kibana下載
logstash下載
filebeat下載
將上面的rpm
包下載好,上傳到指定主機,用yum命令安裝即可。
1.3 需求說明
- 所有日誌收集後,通過index進行區分;
- 不同的服務,輸出到不同的index中;
- 相同的服務,不在一個主機,也輸入到一個index進行管理。
- index按照時間滾動,只保留指定天數(比如7天)的index,防止不斷積累。
2. elasticsearch簡單配置
2.1 elasticsearch配置
es簡單配置如下
cluster.name: my-application # 集羣名稱,3個節點的都要一樣
node.name: node-104 # 節點名
path.data: /var/lib/elasticsearch # 數據存儲路徑
path.logs: /var/log/elasticsearch # 日誌輸出路徑
network.host: 192.168.100.104 # 主機IP
http.port: 9200 # 開放的端口
# 3節點
discovery.zen.ping.unicast.hosts: ["192.168.100.104:9300", "192.168.100.105:9300","192.168.100.106:9300"]
9200端口是http協議端口,主要用於外部通信
9300端口是tcp協議端口,主要用於集羣間傳遞信息
在每臺主機上修改好配置。啓動es
systemctl start elasticsearch
systemctl status elasticsearch
啓動成功後,可以通過api接口命令查看集羣狀態
curl http://192.168.100.104:9200
curl http://192.168.100.104:9200/_cat/nodes
curl http://192.168.100.104:9200/_cat/master
可以看到3節點都已經加到了集羣中,且104被選爲master。
2.2 es-head配置
需要配置nodejs環境。nodejs可以用yum安裝,或者用源碼安裝。
yum install epel-release git -y
yum install nodejs npm -y
下載源碼
cd /usr/local
git clone https://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm install grunt --save
安裝
npm install -g grunt-cli #安裝grunt命令行工具grunt-cli
npm install grunt --save-dev #安裝grunt及其插件
grunt -version #查看安裝版本情況
修改elasticsearch配置文件,增加如下字段
http.cors.enabled: true
http.cors.allow-origin: "*"
修改es配置可以只在es-head需要連接的那臺主機上進行。
修改elasticsearch-head目錄下的Gruntfile.js文件
#其中增加一段配置
hostname: '0.0.0.0' 或者是 hostname: '*'
如果有端口衝突的情況,也可以修改下面的監聽端口。
啓動es-head
cd /usr/local/elasticsearch-head/ # 注意,一定要進入代碼目錄下啓動,否則啓動不了
nohup grunt server > ./grunt.log 2>&1 &
netstat -tnulp|grep 9100 # 如果沒有端口衝突的情況,啓動不會有什麼異常
如果是長期使用es-head,可以考慮把它配置爲系統服務。
可以參考https://blog.csdn.net/wind_2307154495/article/details/79402911
啓動成功後就可以連接使用了。
3. kibana簡單配置
配置文件:/etc/kibana/kibana.yml
server.port: 5601
server.host: "192.168.100.106"
server.name: "elk-106"
elasticsearch.hosts: ["http://192.168.100.106:9200"] # es地址
kibana.index: ".kibana"
logging.dest: /var/log/kibana.log # 日誌輸出路徑
i18n.locale: "zh-CN" # 中文配置
注意:
- kibana如果不配置日誌輸出,一般日誌會輸出到/var/log/message裏面,導致系統日誌文件越來越大,且信息太多,難以區分,所以最好配置單獨的日誌輸出路徑。如果要配置日誌輸出路徑,特別要注意權限文件,執行以下命令
touch /var/log/kibana.log
chown kibana.kibana /var/log/kibana.log
# 或者直接改權限
chmod 666 /var/log/kibana.log
登錄:http://192.168.100.106:5601
可以添加樣例數據。打開之後如下顯示:
es索引管理
4. elasticsearch配置用戶認證,權限管理(X-pack)
生產中,需要對es進行管理,首先要有權限管理配置,否則任何人,只要能訪問到es主機,知道端口,都可以對他進行管理操作,這是非常危險的。
如果是生產中,需要添加es認證,需要停服務,這個操作,需要提前跟開發溝通好,最好選擇業務低峯期。這樣對用戶的影響就非常小。
- 生成祕鑰,
在主節點執行以下操作
/usr/share/elasticsearch/bin/elasticsearch-certutil ca
/usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
mkdir /etc/elasticsearch/cert/
mv elastic-* /etc/elasticsearch/cert/
chmod 600 /etc/elasticsearch/cert/*
chown -R elasticsearch.elasticsearch /etc/elasticsearch/cert/elastic-* # 更改權限
生成的配置文件elastic-certificates.p12需要copy到所有節點上/etc/elasticsearch/cert/目錄下,注意保存祕鑰密碼
2. 祕鑰密碼認證,在所有節點執行
這一步一定不能少,否則es會啓動報錯,啓動失敗
/usr/share/elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
/usr/share/elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
- 所有節點增加如下配置
vim /etc/elasticsearch/elasticsearch.yml
# ---------------------------------- X-pack ------------------------------------
xpack.license.self_generated.type: basic
#
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: cert/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: cert/elastic-certificates.p12
#
#-------ellasticsearch-head-------------
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
- 重啓服務
sudo systemctl start elasticsearch.service
sudo systemctl status elasticsearch.service
要確保各節點服務啓動正常,上面的命令執行缺一不可,如果啓動異常可以通過日誌檢查錯誤。
5. 重啓之後,生成賬號密碼(在其中一臺上執行)
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto
執行後會生成一些默認賬號的密碼:
6. 配置kibana,配置賬號密碼
增加如下配置段
配置完成後,重啓,重新刷新kibana頁面
sudo systemctl restart kibana.service
輸入你的賬號密碼既可以了。
常用的賬號已經配置到了es中
賬號配置流程:新建角色–>配置角色權限(集羣權限,索引權限,可以使用正則匹配)–>配置用戶(綁定角色)
配置角色權限也可以直接用已經配置好的角色,以權限角色運行。
角色權限參考:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/security-privileges.html#privileges-list-cluster
爲了方便開發人員查看日誌,我們新建一個只讀賬號
索引權限,可以使用正則匹配。只給只讀權限。
如果是項目使用,在配置單獨索引的讀寫權限。
單個用戶,是可以選擇多個角色的。
使用新建用戶的賬號密碼登錄。可以看到,用戶看不到es的index界面,也不能修改kibana已經創建的索引。
下面是日誌傳送流程:
5. filebeat配置
/etc/filebeat/filebeat.yml
filebeat.inputs:
# 這一段是默認配置
- type: log
enabled: false # 是否啓用,默認不啓用
paths:
- /var/log/*.log
# 下面是我們自定義的配置
- type: log
enable: true # 啓用配置,收集日誌
paths:
- /tmp/002.txt # 日誌路徑,可以定義多個,可以使用正則
tail_files: true # Filebeat從文件尾開始監控文件新增內容,非從頭開始
document_type: "test-redis" #設定Elasticsearch輸出時的document的type字段 可以用來給日誌進行分類。Default: log
fields_under_root: true
fields: # 下面是自定義字段,可以用來區分日誌類型,日誌信息
log_type: "test-redis"
service: "test-redis"
- type: log
enable: true
paths:
- /tmp/003.txt # 這個是測試路徑,方便我們調試
tail_files: true
document_type: "testlog"
exclude_files: ['.gz$']
tags: "testlog"
fields_under_root: true
fields:
log_type: "testlog"
service: "testlog"
# java日誌收集
- type: log
enable: true
paths:
- /tmp/logs/catalina*
exclude_files: ['.gz$']
exclude_lines: ['^$']
tags: "java"
# 定義多行的情況
multiline:
# 這個匹配,根據日誌情況自定義
pattern: '^\s*(\d{4}|\d{2})\-(\d{2}|[a-zA-Z]{3})\-(\d{2}|\d{4})'
negate: true
match: after
max_lines: 1000
timeout: 60
fields_under_root: true
fields:
log_type: "java"
service: "cms"
# 下面是輸出配置
# 具體配置參考官網:https://www.elastic.co/guide/en/beats/filebeat/current/redis-output.html
# 輸出中間,如果數據量不大的情況下,redis是很好的選擇,數據量很大,建議使用kafka集羣
output.redis:
hosts: ["192.168.100.104:6379"]
password: "changeme" # redis一定要加上認證
key: "filebeat" # 日誌發佈到的Redis列表或渠道的名稱
db: 0
timeout: 5 #連接超時時間
如何對filebeat蒐集的日誌進行區分,然後保存到不同的index裏面呢?
通過自定義字段
redis簡單配置
主要是下面兩個配置。
bind 192.168.100.104
requirepass changme
配置完成後,可以啓動服務了。
systemctl restart filebeat
systemctl restart redis
注意觀察日誌啊。
6. logstash配置
日誌通過filebeat到了redis,然後logstash從redis中取數據,輸出到es中,在這一部,我們要通過自定義的字段,把日誌輸出到不同的index中。
配置如下:
vim /etc/logstash/conf.d/redis.conf
注意:logstash配置文件路徑是/etc/logstash/conf.d/
# 從redis中拿數據
input {
redis {
data_type => "list"
key => "filebeat"
host => "192.168.100.104"
port => "6379"
password => "changme"
}
}
# 輸出到es中
output {
# 通過自定義字段fields.service判斷日誌是屬於哪個服務的,相同的服務輸出到一個index中
if [service] {
elasticsearch {
hosts => ["192.168.100.104:9200","192.168.100.105:9200","192.168.100.106:9200"]
user => "elastic"
password => "changme"
index => "logstash-%{service}-%{+YYYY.MM.dd}"
http_compression => true
}
}
# 如果沒有source字段匹配,就輸出到另一個公共的index中
else {
elasticsearch {
hosts => ["192.168.100.104:9200","192.168.100.105:9200","192.168.100.106:9200"]
user => "elastic"
password => "changme"
index => "logstash-other-%{+YYYY.MM.dd}"
http_compression => true
}
}
}
配置之後,可以先對配置文件進行測試,確認配置沒有問題
/usr/share/logstash/bin/logstash -t /etc/logstash/conf.d/redis.conf --debug
配置文件檢查沒有問題,重啓logstash服務
sudo systemctl restart logstash
7. 開始測試
現在所有服務都已經配置完了。我們開始測試。
剛纔在filebeat中定義了3個日誌輸入路徑:
/tmp/002.txt 對應service:test-redis
/tmp/003.txt 對應service:testlog
/tmp/logs/catalina* 對應service:cms
寫入日誌到這些測試文件中。可以看到已經有index了
然後創建kibana的索引,方便進行查看
創建完索引之後,就可以在Discover裏面看到了
其它幾個kibana索引的創建方式。參考上面的即可。
至此,所有流程就全部打通了。
後面需要做的工作:
- nginx接入進來,展示nginx信息,站點訪問情況,狀態碼等等
- es的index要按照日期,定時刪除
es的定期刪除策略
可以參考如下腳本:
# 保留15天內日誌索引
date=$(date -d "-15 days" "+%Y.%m.%d")
# 獲取要刪除的索引
delete_index=$(curl -s -u elastic:l7oTPEalirnWNBZHnuWt http://192.168.100.104:9200/_cat/indices|grep test|grep ${date} |awk '{print $3}')
#
for index in ${delete_index}
do
#echo $index
curl -XDELETE -u elastic:changme http://192.168.100.104:9200/$index
done
使用es的定期刪除策略
- 配置生命週期管理:3天后刪除
- 配置索引模板,引用策略
在kibana的開發工具中操作
PUT _template/logs_template
{
"index_patterns": ["logs-*"], # 匹配所有以logs開頭的索引
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "delete-3day",
"index.lifecycle.rollover_alias": "logs"
}
}
參考:
https://www.elastic.co/guide/en/elasticsearch/reference/6.8/_applying_a_policy_to_our_index.html
注意:只有新索引會自動綁定策略,原來的不會變化,還是需要手動綁定