日志管理系統ELK6.2.3


https://www.jianshu.com/p/88f2cbedcc2a

寫在前面

剛畢業工作的時候,處理日志喜歡自己寫腳本抓取數據分析日志,然后在zabbix上展示出來。但是開發要看日志的時候,還是要登錄服務器,使用tailf、grep加一些正則,很是麻煩。來到一個新環境,需要搭建一套日志管理系統,接觸了elk,相見恨晚,記錄下自己從零開始學習使用elk的過程。

日志管理系統ELK

目錄

  • 部署架構圖
  • 部署版本
  • 部署地址
  • 服務部署
  • 總結

部署架構圖:

 
elk.png

部署前了解:

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配置文件的寫法

貼一個日志分析圖,具體實現參考后續文檔。


 
elk.png


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM