一、前言
? 日志主要包括系統日志和應用程序日志,運維和開發人員可以通過日志了解服務器中軟硬件的信息,檢查應用程序或系統的故障,了解故障出現的原因,以便解決問題。分析日志可以更清楚的了解服務器的狀態和系統安全狀況,從而可以維護服務器穩定運行。
? 但是日志通常都是存儲在各自的服務器中。如果管理數十台服務器, 查閱日志需要依次登陸不同的服務器,查看過程就會很繁瑣從而導致工作效率低下。雖然可以使用 rsyslog 服務將日志匯總。但是統計一些日志中的數據或者檢索也是很麻煩的,一般使用grep、awk、wc、sort等Linux命令來統計和檢索。如果對數量巨大的日志進行統計檢索,人工的效率還是十分低下。
? 通過我們對日志進行收集、匯總到一起,完整的日志數據具有非常重要的作用:
- 信息查找。通過檢索日志信息,查找相應的報錯,可以快速的解決BUG。
- 數據分析。如果是截斷整理格式化后的日志信息,可以進一步對日志進行數據分析和統計,可以選出頭條,熱點,或者爆款。
- 系統維護。對日志信息分析可以了解服務器的負荷和運行狀態。可以針對性的對服務器進行優化。
二、ELK簡介
? ELK實時日志收集分析系統可以完美的解決以上問題。ELK作為一款開源軟件可以免費使用,也有強大的團隊和社區對它實時更新。
? ELK主要由ElasticSearch、Logstash和Kibana三個開源工具組成,還有其他專門由於收集數據的輕量型數據采集器Beats。
Elasticsearch?:分布式搜索引擎。具有高可伸縮、高可靠、易管理等特點。可以用於全文檢索、結構化檢索和分析,並能將這三者結合起來。Elasticsearch 是用Java 基於 Lucene 開發,現在使用最廣的開源搜索引擎之一,Wikipedia 、StackOverflow、Github 等都基於它來構建自己的搜索引擎。
在elasticsearch中,所有節點的數據是均等的。
Logstash?:數據收集處理引擎。支持動態的從各種數據源搜集數據,並對數據進行過濾、分析、豐富、統一格式等操作,然后存儲以供后續使用。
Kibana?:可視化化平台。它能夠搜索、展示存儲在 Elasticsearch 中索引數據。使用它可以很方便的用圖表、表格、地圖展示和分析數據。
Filebeat:輕量級數據收集引擎。相對於Logstash所占用的系統資源來說,Filebeat 所占用的系統資源幾乎是微乎及微。它是基於原先 Logstash-fowarder 的源碼改造出來。換句話說:Filebeat就是新版的 Logstash-fowarder,也會是 ELK Stack 在 Agent 的第一選擇。
版本說明:
Elasticsearch、Logstash、Kibana、Filebeat安裝的版本號必須全部一致,不然會出現kibana無法顯示web頁面。
ELK工作演示圖:
- Filebeat在APP Server端收集日志
- Logstash處理過濾Filebeat收集過來的日志
- Elasticsearch存儲Logstash提供的處理之后的日志,用以檢索、統計
- Kibana提供web頁面,將Elasticsearch的數據可視化的展示出來
三、ELK安裝部署
1 . 首先配置JDK環境
#自行下載jdk
rpm -ivh jdk-8u144-linux-x64.rpm
#或者 yum install java-1.8.0-openjdk*
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64
export PATH=$JAVA_HOME/jre/bin:$PATH
source /etc/profile.d/java.sh
2 . 配置ELK yum源
vim /etc/yum.repo.d/ELK.repo
[ELK]
name=ELK-Elasticstack
baseurl=https://mirrors.tuna.tsinghua.edu.cn/elasticstack/yum/elastic-6.x/
gpgcheck=0
enabled=1
#關閉selinux
setenforce 0
sed -i.bak 's@^SELINUX=\(.*\)@SELINUX=disabled@p' /etc/selinux/config
#關閉防火牆
#Centos7
systemctl disable firewalld
systemctl stop firewalld
#CentOS6
service iptables stop
service iptables disable
3 . 部署elasticsearch
1. 安裝elasticsearch
yum install elasticsearsh
# 修改系統配置文件屬性
# vim /etc/security/limits.conf
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
elasticsearch soft nofile 65536
elasticsearch hard nofile 131072
2. 修改配置文件
# vim /etc/elasticsearch/elasticsearch.yml
#集群名稱
cluster.name: els
#節點名稱
node.name: els-1
#數據存放路徑
path.data: /data/els_data
#日志存放路徑
path.logs: /data/log/els
#鎖定jvm.options指定的內存,不交換swap內存
bootstrap.memory_lock: true
#綁定IP地址
network.host: 172.16.1.49
#端口號
http.port: 9200
#配置集群配置,填寫集群節點,會自動發現節點
# discovery.zen.ping.unicast.hosts: ["host1", "host2"]
# 集群配置 只需要修改節點名,和綁定ip地址即可
# vim /etc/elasticsearch/jvm.options
-Xms1g #指定占用內存大小,兩個數字要一致 都是1g
-Xmx1g
3. 創建數據目錄
#創建elasticsearch數據庫目錄,並且修改屬主為elasticsearch·
mkdir /data/els_data
mkdir /data/log/els
chown -R elasticsearch.elasticsearch /data/els_data
chown -R elasticsearch.elasticsearch /data/log/els
4. 啟動elasticsearch
systemctl start elasticsearch
# 啟動后自動關閉
#報錯
[1] bootstrap checks failed
[1]: memory locking requested for elasticsearch process but memory is not locked
#將配置文件中的 bootstrap.memory_lock: true 注釋掉,不使用;即可啟動成功
報錯
啟動成功后
訪問172.16.1.49:9200
Elasticsearch API
- 集群狀態:http:// 172.16.1.100:9200/_cluster/health?pretty
- 節點狀態:http:// 172.16.1.100:9200/_nodes/process?pretty
- 分片狀態:http:// 172.16.1.100:9200/_cat/shards
- 索引分片存儲信息:http:// 172.16.1.100:9200/index/_shard_stores?pretty
- 索引狀態:http:// 172.16.1.100:9200/index/_stats?pretty
- 索引元數據:http:// 172.16.1.100:9200/index?pretty
4. 部署Kibana
Kibana是node.js 編寫的,不需要java環境。直接安裝即可
1. 安裝Kibana
yum install kibana
# 版本號需要和Elasticsearch 相同
2. 配置Kibana
vim /etc/kibana/kibana.yml
server.port: 5601
server.host: "172.16.1.50"
elasticsearch.url: "http://172.16.1.49:9200"
kibana.index: ".kibana"
logging.dest: /data/log/kibana/kibana.log # 配置kibana日志輸出到哪里
# 創建日志目錄文件
mkdir -p /data/log/kibana/
touch /data/log/kibana/kibana.log
chmod o+rw /data/log/kibana/kibana.log
訪問172.16.1.50:5601
出現 Kibana server is not ready yet
說明kibana與Elasticsearch版本號不一致
# 查看版本號
rpm -qa elasticsearch kibana
如果版本號一模一樣,那就多刷新幾次頁面吧。。。。
啟動成功后,訪問頁面可以看到:
5. 部署Logstash
配置與Elasticsearch相同的Java環境,版本為8以上的Java環境。
1. 安裝Logstash
yum install logstash-"Version"
2. 修改配置文件
http.host: "172.16.1.229"
http.port: 9600-9700
3. 配置收集nginx日志配置文件
- 修改nginx的日志格式
log_format main '{"@timestamp":"$time_iso8601",' '"host":"$server_addr",' '"clientip":"$remote_addr",' '"request":"$request",' '"size":$body_bytes_sent,' '"responsetime":$request_time,' '"upstreamtime":"$upstream_response_time",' '"upstreamhost":"$upstream_addr",' '"http_host":"$host",' '"url":"$uri",' '"referer":"$http_referer",' '"agent":"$http_user_agent",' '"status":"$status"}'; access_log /var/log/nginx/access_test.log main;
- 配置Lostash收集日志配置文件
input { file { type =>"nginx-log" path => ["/var/log/nginx/access.log"] start_position => "beginning" sincedb_path => "/dev/null" } } output { elasticsearch { hosts => ["172.16.1.49:9200"] index => "nginx-log-%{+YYYY.MM}" } }
4. 測試配置文件可用性
cd /usr/share/logstash/bin
./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/nginx.conf --config.test_and_exit
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties
[2019-02-20T17:34:29,949][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
Configuration OK # 配置文件OK 可以使用
[2019-02-20T17:34:39,048][INFO ][logstash.runner ] Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash
WARN報錯不影響運行
直接使用命令
./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/nginx.conf
就可以直接運行logstash
6. 部署filebeat
? Logstash的數據都是從Beats中獲取,Logstash已經不需要自己去數據源中獲取數據了。
? 以前我們使用的日志采集工具是logstash,但是logstash占用的資源比較大,沒有beats輕量,所以官方也推薦使用beats來作為日志采集工具。而且beats可擴展,支持自定義構建。
yum install filebeat-6.6.0
1. 修改filebeat配置文件
vim /etc/filebeat/filebeat.yml
- type: log
paths:
- /Log_File #/var/log/messages
#output.elasticsearch: #注釋掉輸出到elasticsearch的配置
# hosts: ["localhost:9200"]
output.console: #添加輸出到當前終端的配置
enable: true
2. 測試filebeat
/usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml #運行filebeat,可以看見日志輸出在當前終端
3. 修改配置將日志輸出到elasticsearch中
- type: log
paths:
- /Log_File #/var/log/messages
output.elasticsearch: #注釋掉輸出到elasticsearch的配置
hosts: ["172.16.1.49:9200"]
啟動 filebeat
systemctl start filebeat
運行
curl ‘172.16.1.49:9200/_cat/indices?v‘
,查看日志索引
4. 在Kibana中配置索引
即可查看到日志
5. 將日志輸出到logstash中
#------------------- Logstash output ----------------------
output.logstash: #將輸出到elasticsearch的配置注釋
# The Logstash hosts
hosts: ["172.16.1.229:5044"]
# Optional SSL. By default is off.
# List of root certificates for HTTPS server verifications
#ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]
# Certificate for SSL client authentication
#ssl.certificate: "/etc/pki/client/cert.pem"
# Client Certificate Key
#ssl.key: "/etc/pki/client/cert.key"
6. 配置logstash
vim /etc/logstash/conf.d/test.conf
input {
beats {
port =>5044
}
}
#filter{} #過濾器,自定義過濾日志中的一些數據
output {
stdout {
codec => rubydebug
}
elasticsearch {
hosts => "172.16.1.49:9200"
index => "test-log-%{+YYYY.MM.dd}"
}
}
Elasticsearch上已經有了日志索引,在kibana上也可以查看到
yellow 表示沒有副本節點可用,因為測試時沒有搭建兩台Elasticsearch
可以用filebeat監控個自定義文件,手動插入數據。