https://www.jianshu.com/p/88f2cbedcc2a
寫在前面
剛畢業工作的時候,處理日志喜歡自己寫腳本抓取數據分析日志,然后在zabbix上展示出來。但是開發要看日志的時候,還是要登錄服務器,使用tailf、grep加一些正則,很是麻煩。來到一個新環境,需要搭建一套日志管理系統,接觸了elk,相見恨晚,記錄下自己從零開始學習使用elk的過程。
日志管理系統ELK
目錄
- 部署架構圖
- 部署版本
- 部署地址
- 服務部署
- 總結
部署架構圖:

部署前了解:
1、elk現在又叫elfk,是elasticsearch、logstash、filebeat、kibana的簡稱。
2、elk架構類似於C/S,由客戶端的日志收集工具收集日志,服務端的日志收集工具收集分析客戶端的日志。之前客戶端的日志收集工具logstash是用java寫的,比較占用內存,為了不給生產環境造成負擔,生產環境上的日志收集工具換成了用go語言寫的filebeat,filebeat將日志收集到redis里面,利用redis做消息隊列,服務端的logstash從redis里面取數據,分析,傳到elasticsearch,最后用kibana展示出來
3、本次安裝是安裝在內網,故沒有考慮到安全的問題,安裝過程中會提到
4、本次安裝是基於debian,如果是centos注意從官網下載不同的軟件包、還要注意防火牆、selinux等問題。安裝過程是大同小異的
5、本次安裝時,日志量不算大,所以es用的是單機
部署版本:
filebeat:6.2.3
redis: 2.8.17
logstash:6.2.3
elasticsearch:6.2.3
kibana:6.2.3
部署地址:
服務 | 服務器地址 | 系統 | 部署目錄 |
---|---|---|---|
filebeat | log | debian8.9 | /app/elk |
redis | elk | debian8.9 | |
logstash | elk | debian8.9 | /app/elk/logstash-6.2.3 |
elasticsearch | elk | debian8. 9 | /app/elk/elasticsearch-6.2.3 |
kibana | elk | debian8. 9 | /app/elk /kibana-6.2.3-linux-x86_64 |
服務部署:
1、redis:
考慮到logstash直接把日志丟給es,會導致es吃不消,故加了一個redis做隊列緩存。也可以用kafka之類的,都是官網推薦,這里用redis,因為簡單,而且做隊列用,不占內存
redis直接安裝就行
apt-get install redis-server
配置文件地址:/etc/redis/redis.conf
1、啟動
service redis-server start
2、查看日志:
tailf /var/log/redis/redis-server.log
3、報警告:
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
按照建議做,不然有可能導致數據丟失
4、報錯:
[20109] 27 Mar 10:28:17.052 * Background saving started by pid 20760 [20760] 27 Mar 10:28:17.052 # Failed opening .rdb for saving: Permission denied
沒有權限導致持久化失敗
解決:
chmod 755 dump.rdb
5、關於安全建議:
- redis內網通信
- 修改默認端口號,開啟賬號密碼登錄
- 打開防火牆,添加白名單
6、測試:
在需要收集日志的客戶端telnet下redis加port,確保通信沒問題
2、Elasticsearch
1、安裝目錄:
/app/elk/elasticsearch-6.2.3
2、安裝依賴:
es是用java寫的,所以需要安裝jdk1.8,這里用oracle_jdk1.8,openjdk和其他版本的支持不支持elk6.2.3我不清楚
jdk1.8的安裝:
2.1、下載jdk至指定目錄 /usr/local
jdk1.8:http://download.oracle.com/otn-pub/java/jdk/8u162-b12/0da788060d494f5095bf8624735fa2f1/jdk-8u162-linux-x64.tar.gz
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" -P /usr/local http://download.oracle.com/otn-pub/java/jdk/8u162-b12/0da788060d494f5095bf8624735fa2f1/jdk-8u162-linux-x64.tar.gz
2.2、解壓
tar zxvf /usr/local/jdk-8u162-linux-x64.tar.gz -C /usr/local/
2.3、配置環境變量
export JAVA_HOME=/usr/local/jdk1.8.0_162 export JAVA_BIN=/usr/local/jdk1.8.0_162/bin export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jart
4、安裝es:
cd /app/elk
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.3.deb tar zxvf elasticsearch-6.2.3.tar.gz
配置文件:/app/elk/elasticsearch-6.2.3/config/elasticsearch.yml
ath.data: /app/elk/elasticsearch-6.2.3/data
path.logs: /app/elk/elasticsearch-6.2.3/logs
network.host: ip ####這里寫es服務器的ip
5、創建elk賬號
為了安全起見,es不支持以root用戶啟動,所以先創建elk賬號
####debian創建賬號,賦予sudo權限。其他linux發行版的命令可以自行google adduser elk groups elk usermod -aG sudo elk visudo 添加: elk ALL=(ALL) NOPASSWD: ALL chown -R elk.elk /app/elk
6、啟動:
切換用戶,啟動。我這里圖省事就直接nohup啟動了。正規點的可以用screen、supervisor這些,別忘了加入開機自啟動
su elk
nohup /app/elk/elasticsearch-6.2.3/bin/elasticsearch > /var/log/es.log 2>&1 &
7、查看nohup.out日志,檢查報錯
看有沒有報錯:如果報錯,需要設置文件打開數和vm.max_map_count,那么就進行修改,
文件打開數:
vim /etc/security/limits.conf
root soft nofile 65535
root hard nofile 65535
* soft nofile 65536
* hard nofile 65535
elk soft nofile 655350
elk hard nofile 655350
jvm最大線程數:
sysctl -w vm.max_map_count=262144
其他錯誤請自行Google
8、啟動成功:
查看es
ip和端口需要和配置文件保持一致
curl http://ip:9200
9、安全建議:
- es加賬號密碼
- 通信用tls
至此,單機版的es就算安裝成功了。O(∩_∩)O
3、filebeat
1、安裝機器:需要收集日志的機器
安裝目錄:/app/
debian安裝:
cd /app/elk curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.3-amd64.deb sudo dpkg -i filebeat-6.2.3-amd64.deb
2、配置文件:/etc/filebeat/filebeat.yml
配置:
####收集日志的位置,標簽 filebeat.prospectors: - type: log enabled: true paths: - /var/log/nginx/access.log fields: list: access.log ####配置文件模板地址,是否自動加載 filebeat.config.modules: path: ${path.config}/modules.d/*.yml reload.enabled: false setup.template.settings: index.number_of_shards: 3 ####收集的日志輸出到的地方,這里是用了redis的消息隊列功能 output.redis: hosts: ["ip"] ##redis ip port: port ##redis port key: "%{[fields.list]}" ##key值,這里用了變量,好歸類不同的日志 db : 5 ##db庫,自由選擇
3、啟動:
service filebeat start
4、檢查:
啟動后,可以進入redis的對應db里面,使用keys * 查看未消費的隊列,如果沒有消費完,那么應該能看到list值,這里是access.log。說明日志已經收集到redis緩存里面了。
4、logstash
logstash是收集處理日志用的,跟filebeat差不多,最大的區別是logstash自帶graok解析、切割日志,而filebeat功能沒這么強大,但是filebeat用go寫,輕量,不占內存,故可以放到客戶端收集日志,服務端還是用logstsh
1、目錄:/app/elk/logstash
cd /app/elk/
wge https://artifacts.elastic.co/downloads/logstash/logstash-6.2.3.deb tar zxvf logstash-6.2.3.tar.gz
2、logstash的配置文件:/app/elk/logstash-6.2.3/config/logstash.yml
path.data: /app/elk/logstash-6.2.3/data path.logs: /app/elk/logstash-6.2.3/logs
3、日志收集的配置文件:/app/elk/logstash-6.2.3/conf/
分為三部分:
- input:日志的來源,這里來源是之前收集緩存日志的redis
- filter:日志切割,有沒有這一塊也能用,這是優化顯示的日志用的
- output:日志輸出的地方,參考架構圖,輸出到es
這里貼出我的,略去了敏感字段
#--------------------------------This is input setting----------------------------------------- input { redis { host => "ip" type => "test.access.log" data_type => "list" key => "test.access.log" port => "6379" db => 5 } redis { host => "ip" type => "test.error.log" data_type => "list" key => "test.error.log" port => "6379" db => 5 } } #--------------------------------This is filter setting---------------------------------------- filter { if [type] == "test.access.log"{ grok{ match => {"message" => "%{IP:clientip} - - \[%{HTTPDATE:timestamp}\] \"%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})\" %{NUMBER:response}" } } geoip { source => "clientip" target => "geoip" database => "/app/elk/logstash-6.2.3/etc/GeoLite2-City.mmdb" add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ] add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ] } mutate { convert => [ "[geoip][coordinates]", "float"] } } } #-------------------------------This is output setting--------------------------------------- output { if [type] == "test.access.log"{ elasticsearch { hosts => ["ip:9200"] index => "test.access.log"} } if [type] == "test.error.log"{ elasticsearch { hosts => ["ip:9200"] index => "test.error.log"} } stdout { codec => rubydebug } }
6、啟動:nohup /app/elk/logstash-6.2.3/bin/logstash -f /app/elk/logstash-6.2.3/conf > /app/elk/logstash-6.2.3/nohup.out 2>&1 &
5、kibana
1、目錄:/app/elk/kibana-6.2.3-linux-x86_64
cd /app/elk
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.2.4-linux-x86_64.tar.gz tar zxvf kibana-6.2.3-linux-x86_64.tar.gz
2、配置文件:
server.port: port
server.host: ip
server.name: name
elasticsearch.url: "http://ip:9200" tilemap.url: 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}'
3、啟動:nohup /app/elk/kibana-6.2.3-linux-x86_64/bin/kibana > /var/log/kibana.log 2>&1 &
4、檢查:
打開 剛設置的 http://ip:port,就可以看到kibana界面了。
安全建議:
kibana沒有賬號登錄的功能,需要依賴插件X-pack,但是x-pack 不是免費的,所以可以用nginx的auth登錄
總結:
至此,elk就搭建完畢了,大家可以到kikana上建立索引,自由查看日志了
由於elk版本較多,網絡上的教程質量也是參差不齊,大家搭建的時候,要以官方文檔為准,配置文件的寫法,也要以官方文檔為准。然后啟動前要測試,啟動的時候要注意查看日志。
后續文檔內容:kibana的使用、elk結合釘釘告警、logstash配置文件的寫法
貼一個日志分析圖,具體實現參考后續文檔。

作者:OrangeLoveMilan
鏈接:https://www.jianshu.com/p/88f2cbedcc2a
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。