EFK架構圖
一、EFK簡介
EFK不是一個軟件,而是一套解決方案,並且都是開源軟件,之間互相配合使用,完美銜接,高效的滿足了很多場合的應用,是目前主流的一種日志系統。 EFK是三個開源軟件的縮寫,分別表示:Elasticsearch , FileBeat, Kibana , 其中ELasticsearch負責日志保存和搜索,FileBeat負責收集日志,Kibana 負責界面 Elasticsearch:是個開源分布式搜索引擎,提供搜集、分析、存儲數據三大功能。 特點:分布式,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。 kibana:是一個開源和免費的工具,它可以為 Logstash 、Beats和 ElasticSearch提供友好的web可視化界面,幫助您匯總、分析和搜索重要數據日志。 Filebeat由兩個主要組件組成:prospector 和harvester。 啟動Filebeat時,它會啟動一個或多個查找器(prospector),查看您為日志文件指定的本地路徑。 對於prospector 所在的每個日志文件,prospector 啟動harvester。 每個harvester都會為新內容讀取單個日志文件,並將新日志數據發送到libbeat,后者將聚合事件並將聚合數據發送到您為Filebeat配置的輸出。 Filebeat隸屬於Beats。目前Beats包含六種工具: Packetbeat(搜集網絡流量數據) Metricbeat(搜集系統、進程和文件系統級別的 CPU 和內存使用情況等數據) Filebeat(搜集文件數據) Winlogbeat(搜集 Windows 事件日志數據) Auditbeat( 輕量型審計日志采集器) Heartbeat(輕量級服務器健康采集器) Logstash替換成了FileBeat,因為Filebeat相對於Logstash來說有2個好處: 1、侵入低,無需修改程序目前任何代碼和配置 2、相對於Logstash來說性能高,Logstash對於IO占用很大
二、Docker部署EFK
1、部署前考慮安全加密問題
1、修改服務默認的端口號 2、防火牆設置 3、頁面用戶名密碼驗證
2、Docker搭建單台elasticsearch,並開啟安全驗證
#提前准備
docker pull elastic/elasticsearch:7.1.0 mkdir /server/docker/efk/es/
vim /server/docker/efk/es/es.yml
cluster.name: elasticsearch-cluster network.host: 0.0.0.0 http.port: 9200 xpack.security.enabled: true #這一步是開啟x-pack插件
docker啟動es:
docker run --name=es -p 9200:9200 -p 9300:9300 \ -e ES_JAVA_OPTS="-Xms256m -Xmx512m" \ -e "discovery.type=single-node" \ -v /server/docker/efk/es/es.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ -itd elastic/elasticsearch:7.1.0
注:-e "discovery.type=single-node" #意思為單台啟動 -e ES_JAVA_OPTS="-Xms256m -Xmx512m" #設置內存限制 EFK版本可以選擇最新的,目前是7.12.1
開啟安全認證:
docker exec -it es /bin/bash #進入容器內部 cd /usr/share/elasticsearch/bin ./elasticsearch-certutil cert -out config/elastic-certificates.p12 -pass "" #開啟x-pack安全認證證書 ./elasticsearch-users useradd admin -p 123456 -r superuser #創建一個用戶 ./elasticsearch-users list #查看有哪些用戶 #如想修改用戶密碼、刪除用戶: ./elasticsearch-users userdel admin #刪除用戶 ./elasticsearch-users passwd 用戶名 #修改用戶密碼
3、Docker搭建kibana
#提前准備 mkdir /server/docker/efk/kibana/ vim /server/docker/efk/kibana/kibana.yml
server.name: kibana server.host: "0.0.0.0" server.port: 5601 kibana.index: ".kibana" elasticsearch.hosts: [ "http://192.168.1.10:9200" ] elasticsearch.username: "admin" elasticsearch.password: "123456" xpack.security.enabled: true i18n.locale: "zh-CN"
docker啟動kibana:
docker run --restart=always --name=kibana -p 5601:5601 \ -e ELASTICSEARCH_URL=http://192.168.1.10:9200 \ -v /server/docker/efk/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml \ -itd elastic/kibana:7.1.0
訪問kibana頁面:http://192.168.1.10:5601 登錄名:admin 密碼:123456
4、Filebeat倆種方式部署
tar -xf filebeat-7.1.0-linux-x86_64.tar.gz mv filebeat-7.1.0-linux-x86_64 /usr/local/filebeat-7.1.0 cd /usr/local/filebeat-7.1.0
#默認索引名字為“filebeat-*”,所有的日志都收集在這個索引下,所以我們需要自定義,實現索引開頭一致,中間是各自的程序名,看名字就知道是哪個程序日志。 vim filebeat.yml
filebeat.inputs:
#定義日志收集路徑 - type: log enabled: true paths: - /server/apache-tomcat-8.5.34-9081/logs/catalina.out - /server/apache-tomcat-8.5.34-9081/webapps/thirdBuy/logs/*.log fields: source: dubbo - type: log enabled: true paths: - /home/project/logs/eureka-service/eureka-service.log fields: source: eureka-service - type: log enabled: true paths: - /home/project/logs/gateway-service/gateway-service.log fields: source: gateway-service filebeat.config.modules: path: ${path.config}/modules.d/*.yml reload.enabled: true setup.template.settings: index.number_of_shards: 1 #定義kibana的IP:PORT setup.kibana: host: "192.168.1.10:5601" #定義模板的相關信息 setup.template.name: "xm_log" setup.template.pattern: "xm-*" setup.template.overwrite: true setup.template.enabled: true #自定義ES的索引需要把ilm設置為false setup.ilm.enabled: false # 定義ES的IP:PORT output.elasticsearch: hosts: ["192.168.1.10:9200"] username: "admin" password: "123456" # 這里的index前綴"xm"與模板的pattern匹配,中間這一串設置為field.source變量,方面后面具體的匹配 index: "xm-%{[fields.source]}-*" indices: # 這里的前綴"xm"同為與模板的pattern匹配,中間為field.source具體的值,當前面的input的field.source值與這里的匹配時,則index設置為定義的值 - index: "xm-dubbo-%{+yyyy.MM.dd}" when.equals: fields: source: "dubbo" - index: "xm-eureka-service-%{+yyyy.MM.dd}" when.equals: fields: source: "eureka-service" - index: "xm-gateway-service-%{+yyyy.MM.dd}" when.equals: fields: source: "gateway-service" processors: - add_host_metadata: ~ - add_cloud_metadata: ~
根據自己的實際情況自定義filebeat.yml配置文件
啟動filebeat:(為防止filebeat掛掉,可以寫一個啟動腳本)
vim /usr/local/filebeat-7.1.0/start.sh
#! /bin/bash ps -ef | grep filebeat | grep -v grep if [ $? -eq 0 ];then echo "It's running...." exit 0 else nohup ./filebeat > logs/filebeat.log 2>&1 & echo "-----------starting----------" fi
添加定時:
0 8 * * * /bin/sh /usr/local/filebeat-7.1.0/start.sh
(2)docker部署filebeat
運行時要把需要收集的日志,和filebeat.yml配置文件掛載到容器里面。
vim filebeat.yml
filebeat: prospectors: - input_type: log paths: # 這里是容器內的path - /var/log/command.log json.keys_under_root: true # 使Filebeat解碼日志結構化為JSON消息,設置key為輸出文檔的頂級目錄。 如果不需要json格式輸出,可以刪除這兩個json參數 json.overwrite_keys: true # 覆蓋其他字段 registry_file: /usr/share/filebeat/data/registry/registry # 這個文件記錄日志讀取的位置,如果容器重啟,可以從記錄的位置開始取日志 output: elasticsearch: # 我這里是輸出到elasticsearch,也可以輸出到logstash index: "rocket" # kibana中的索引 hosts: ["192.168.1.10:9200"] # elasticsearch地址
docker運行filebeat:
docker run --restart=always --name=filebeat \ -v /var/log/command.log:/var/log/command.log:ro \ -v /data/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml \ -v /data/filebeat/registry/:/usr/share/filebeat/data/registry/ -d elastic/filebeat:7.1.0
三、kibana頁面操作
進入管理界面,查看es索引
1、創建索引
2、搜索日志
指定項目日志,可以選定字段、時間查看
3、實時查看日志
四、清理efk索引緩沖
由於索引緩沖太多,導致efk運行緩慢,所以需要定時刪除幾天前的索引緩沖。
手動刪除:
curl -u admin:123456 -XGET http://192.168.1.10:9200/_cat/indices?v | grep 2021.04.28 | awk '{print $3}' #查看某天的索引 curl -s -u admin:123456 -XDELETE http://192.168.1.10:9200/*-2021.03.10 #刪除指定索引
腳本定期刪除:
vim es-index-clean.sh
#!/bin/bash DATE=`date -d "10 days ago" +%Y.%m.%d` #刪除10天前的日志 ck=`curl -s -u admin:123456 -XGET http://192.168.1.10:9200/_cat/indices?v | grep $DATE |awk '{print $3}'` for index in $ck do curl -s -u admin:123456 -XDELETE http://192.168.1.10:9200/$index if [ $? -eq 0 ];then echo "---------delete $DATE index success--------" else echo "---------delete $DATE index fail--------" fi done
添加定時:
0 1 * * * /bin/sh /home/docker/server/efk/es/es-index-clean.sh
五、配置域名訪問(nginx)
vim /usr/local/nginx/conf/nginx.conf
server { listen 80; server_name efk.test.com; location / { pass_proxy http://192.168.1.10:5601; } access_log logs/efk.test.com_access.log; }
/usr/local/nginx/sbin/nginx -t #檢查nginx配置文件
/usr/local/nginx/sbin/nginx -s reload #重新加載配置文件
訪問:http://efk.test.com
大雨里百鬼夜行,我們混在其中,比鬼還高興。