日誌主要包括系統日誌、應用程序日誌和安全日誌。系統運維和開發人員能夠經過日誌瞭解服務器軟硬件信息、檢查配置過程當中的錯誤及錯誤發生的緣由。常常分析日誌能夠了解服務器的負荷,性能安全性,從而及時採起措施糾正錯誤。前端
一般,日誌被分散在儲存不一樣的設備上。若是你管理數十上百臺服務器,你還在使用依次登陸每臺機器的傳統方法查閱日誌。這樣是否是感受很繁瑣和效率低下。當務之急咱們使用集中化的日誌管理,例如:開源的syslog,將全部服務器上的日誌收集彙總。java
集中化管理日誌後,日誌的統計和檢索又成爲一件比較麻煩的事情,通常咱們使用grep、awk和wc等Linux命令能實現檢索和統計,可是對於要求更高的查詢、排序和統計等要求和龐大的機器數量依然使用這樣的方法不免有點力不從心。linux
經過咱們須要對日誌進行集中化管理,將全部機器上的日誌信息收集、彙總到一塊兒。完整的日誌數據具備很是重要的做用:nginx
1)信息查找。經過檢索日誌信息,定位相應的bug,找出解決方案。web
2)服務診斷。經過對日誌信息進行統計、分析,瞭解服務器的負荷和服務運行狀態,找出耗時請求進行優化等等。正則表達式
3)數據分析。若是是格式化的log,能夠作進一步的數據分析,統計、聚合出有意義的信息,好比根據請求中的商品id,找出TOP10用戶感興趣商品。redis
開源實時日誌分析ELK平臺可以完美的解決咱們上述的問題,ELK由ElasticSearch、Logstash和Kiabana三個開源工具組成:docker
1)ElasticSearch是一個基於Lucene的開源分佈式搜索服務器。它的特色有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java開發的,並做爲Apache許可條款下的開放源碼發佈,是第二流行的企業搜索引擎。設計用於雲計算中,可以達到實時搜索,穩定,可靠,快速,安裝使用方便。 shell
在elasticsearch中,全部節點的數據是均等的。apache
2)Logstash是一個徹底開源的工具,它能夠對你的日誌進行收集、過濾、分析,支持大量的數據獲取方法,並將其存儲供之後使用(如搜索)。說到搜索,logstash帶有一個web界面,搜索和展現全部日誌。通常工做方式爲c/s架構,client端安裝在須要收集日誌的主機上,server端負責將收到的各節點日誌進行過濾、修改等操做在一併發往elasticsearch上去。
3)Kibana 是一個基於瀏覽器頁面的Elasticsearch前端展現工具,也是一個開源和免費的工具,Kibana能夠爲 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 界面,能夠幫助您彙總、分析和搜索重要數據日誌。
爲何要用到ELK?
通常咱們須要進行日誌分析場景是:直接在日誌文件中 grep、awk 就能夠得到本身想要的信息。但在規模較大的場景中,此方法效率低下,面臨問題包括日誌量太大如何歸檔、文本搜索太慢怎麼辦、如何多維度查詢。須要集中化的日誌管理,全部服務器上的日誌收集彙總。常看法決思路是創建集中式日誌收集系統,將全部節點上的日誌統一收集,管理,訪問。
通常大型系統是一個分佈式部署的架構,不一樣的服務模塊部署在不一樣的服務器上,問題出現時,大部分狀況須要根據問題暴露的關鍵信息,定位到具體的服務器和服務模塊,構建一套集中式日誌系統,能夠提升定位問題的效率。
一個完整的集中式日誌系統,須要包含如下幾個主要特色:
1)收集-可以採集多種來源的日誌數據
2)傳輸-可以穩定的把日誌數據傳輸到中央系統
3)存儲-如何存儲日誌數據
4)分析-能夠支持 UI 分析
5)警告-可以提供錯誤報告,監控機制
ELK提供了一整套解決方案,而且都是開源軟件,之間互相配合使用,完美銜接,高效的知足了不少場合的應用。目前主流的一種日誌系統。
ELK工做原理展現圖:
Logstash收集AppServer產生的Log,並存放到ElasticSearch集羣中,而Kibana則從ES集羣中查詢數據生成圖表,再返回給Browser。
Logstash工做原理:
Logstash事件處理有三個階段:inputs → filters → outputs。是一個接收,處理,轉發日誌的工具。支持系統日誌,webserver日誌,錯誤日誌,應用日誌,總之包括全部能夠拋出來的日誌類型。
Input:輸入數據到logstash。
一些經常使用的輸入爲:
file:從文件系統的文件中讀取,相似於tial -f命令
syslog:在514端口上監聽系統日誌消息,並根據RFC3164標準進行解析
redis:從redis service中讀取
beats:從filebeat中讀取
Filters:數據中間處理,對數據進行操做。
一些經常使用的過濾器爲:
grok:解析任意文本數據,Grok 是 Logstash 最重要的插件。它的主要做用就是將文本格式的字符串,轉換成爲具體的結構化的數據,配合正則表達式使用。內置120多個解析語法。
mutate:對字段進行轉換。例如對字段進行刪除、替換、修改、重命名等。
drop:丟棄一部分events不進行處理。
clone:拷貝 event,這個過程當中也能夠添加或移除字段。
geoip:添加地理信息(爲前臺kibana圖形化展現使用)
Outputs:outputs是logstash處理管道的最末端組件。一個event能夠在處理過程當中通過多重輸出,可是一旦全部的outputs都執行結束,這個event也就完成生命週期。
一些常見的outputs爲:
elasticsearch:能夠高效的保存數據,而且可以方便和簡單的進行查詢。
file:將event數據保存到文件中。
graphite:將event數據發送到圖形化組件中,一個很流行的開源存儲圖形化展現的組件。
Codecs:codecs 是基於數據流的過濾器,它能夠做爲input,output的一部分配置。Codecs能夠幫助你輕鬆的分割發送過來已經被序列化的數據。
一些常見的codecs:
json:使用json格式對數據進行編碼/解碼。
multiline:將匯多個事件中數據彙總爲一個單一的行。好比:java異常信息和堆棧信息。
======================ELK總體方案=======================
ELK中的三個系統分別扮演不一樣的角色,組成了一個總體的解決方案。Logstash是一個ELK工具,負責從每臺機器抓取日誌數據,對數據進行格式轉換和處理後,輸出到Elasticsearch中存儲。Elasticsearch是一個分佈式搜索引擎和分析引擎,用於數據存儲,可提供實時的數據查詢。Kibana是一個數據可視化服務,根據用戶的操做從Elasticsearch中查詢數據,造成相應的分析結果,以圖表的形式展示給用戶。
ELK的安裝很簡單,能夠按照"下載->修改配置文件->啓動"方法分別部署三個系統,也可使用docker來快速部署。具體的安裝方法這裏不詳細介紹,下面來看一個常見的部署方案,以下圖所示,部署思路是:
1)在每臺生成日誌文件的機器上,部署Logstash,做爲Shipper的角色,負責從日誌文件中提取數據,可是不作任何處理,直接將數據輸出到Redis隊列(list)中;
2)須要一臺機器部署Logstash,做爲Indexer的角色,負責從Redis中取出數據,對數據進行格式化和相關處理後,輸出到Elasticsearch中存儲;
3)部署Elasticsearch集羣,固然取決於你的數據量了,數據量小的話可使用單臺服務,若是作集羣的話,最好是有3個以上節點,同時還須要部署相關的監控插件;
4)部署Kibana服務,提供Web服務。
在前期部署階段,主要工做是Logstash節點和Elasticsearch集羣的部署,而在後期使用階段,主要工做就是Elasticsearch集羣的監控和使用Kibana來檢索、分析日誌數據了,固然也能夠直接編寫程序來消費Elasticsearch中的數據。
採用這樣的架構部署,有三點優點:
第一,下降對日誌所在機器的影響,這些機器上通常都部署着反向代理或應用服務,自己負載就很重了,因此儘量的在這些機器上少作事;
第二,若是有不少臺機器須要作日誌收集,那麼讓每臺機器都向Elasticsearch持續寫入數據,必然會對Elasticsearch形成壓力,所以須要對數據進行緩衝,同時,這樣的緩衝也能夠必定程度的保護數據不丟失;
第三,將日誌數據的格式化與處理放到Indexer中統一作,能夠在一處修改代碼、部署,避免須要到多臺機器上去修改配置。
其次,咱們須要作的是將數據放入一個消息隊列中進行緩衝,因此Redis只是其中一個選擇,也能夠是RabbitMQ、Kafka等等,在實際生產中,Redis與Kafka用的比較多。因爲Redis集羣通常都是經過key來作分片,沒法對list類型作集羣,在數據量大的時候必然不合適了,而Kafka天生就是分佈式的消息隊列系統。
操做篇:
操做環境:
elk-server 192.168.80.181僅主機模式 ELK服務端,接收日誌,提供日誌搜索服務
nginx-server 192.168.80.182NAT模式 Nginx服務端,產生的訪問日誌經過上報到Logstash
https://pan.baidu.com/s/1Z6QAQySEixnH9ZVVjTKmXQ (軟件包)
192.168.80.181:
hostnamectl set-hostname elk.server //修改主機名
exit //退出Xshell 而後從新鏈接 便可
yum install lrz* -y //能夠從真機中拖入安裝包
tar xf jdk-8u144-linux-x64.tar.gz -C /opt/
tar xf kibana-6.2.3-linux-x86_64.tar.gz -C /opt/
tar xf logstash-6.2.3.tar.gz -C /opt/
tar xf elasticsearch-6.2.3.tar.gz -C /opt/
搭建java環境
cd /opt/
cp -r jdk1.8.0_144/ /usr/local/java
vi /etc/profile //最後一行新增
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export PATH=$PATH:/usr/local/java/bin
export CLASSPATH=./:/usr/local/java/lib:/usr/local/java/jre/lib
source /etc/profile
java -version
建立用戶
ElasticSerach要求以非root身份啓動,因此要建立一個用戶:
groupadd elasticsearch
useradd -g elasticsearch elasticsearch
mkdir /usr/local/work
cp -rf elasticsearch-6.2.3/ /usr/local/work/
chown -R elasticsearch.elasticsearch /usr/local/work/elasticsearch-6.2.3
vi /etc/security/limits.conf 新增
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
vi /etc/sysctl.conf //內核配置文件 新增
vm.max_map_count=655360
sysctl -p
重啓此臺虛擬機
啓動ElasticSerach
su elasticsearch
cd /usr/local/work/elasticsearch-6.2.3
bin/elasticsearch -d
tail -f /usr/local/work/elasticsearch-6.2.3/logs/elasticsearch.log
切換到root
curl 127.0.0.1:9200 出現如下內容,表明服務啓動
su -
cd /opt/
至此,ElasticSerach服務啓動成功,接下來是Logstash
配置和啓動Logstash
cp -rf logstash-6.2.3/ /usr/local/work/
cd /usr/local/work/logstash-6.2.3
vi default.conf //新建
input {
beats {
port => "5044"
}
file{
path => ["/usr/local/work/logstash-6.2.3/logs/logstash-plain.log"]
type => "logstash_log"
start_position => "beginning"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
geoip {
source => "clientip"
}
}
output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
}
}
bin/logstash -f default.conf //不可Ctrl+c終止
另開一臺80.182,去測試端口開啓否
tail -f logs/logstash-plain.log //查看日誌
配置和啓動Kibana
cp -rf kibana-6.2.3-linux-x86_64/ /usr/local/work/
cd /usr/local/work/kibana-6.2.3-linux-x86_64/
vi config/kibana.yml
server.host: "192.168.80.181"
server.port: "5601"
nohup bin/kibana &
tail -f nohup.out
在瀏覽器訪問http://192.168.80.181:5601
至此,ELK服務啓動成功
192.168.80.182:
將業務日誌上報上來,須要操做另外一臺電腦:nginx-server
安裝配置nginx
安裝nginx和http用戶認證工具
yum -y install epel-release
yum -y install nginx httpd-tools
systemctl start nginx
filebeat 收集日誌的工具
tar xf filebeat-6.2.3-linux-x86_64.tar.gz -C /opt
mkdir /usr/local/work/
cp /opt/filebeat-6.2.3-linux-x86_64 /usr/local/work/
cd /usr/local/work/filebeat-6.2.3-linux-x86_64/
vi filebeat.yml
enabled: true //修改
- /var/log/*.log => - /var/log/nginx/*.log
output.elasticsearch: 前面加一個「#」註釋掉
hosts: ["localhost:9200"] 前面加一個「#」 註釋掉
#output.logstash 去掉註釋符號
#host: ["localhost:5400"] 去掉註釋符號,並修改成[「192.168.80.100:5400」]
啓動FileBeat: ./filebeat -e -c filebeat.yml -d 「publish」
建立Index Patterns
經過瀏覽器多訪問幾回nginx服務,這樣能多製造一些訪問日誌
訪問Kibana:http://192.168.80.181:5601
點擊左上角的Discover
能夠看到訪問日誌已經被ELK蒐集了
輸入logstash-*,點擊」Next step」
選擇Time Filter,再點擊「Create index pattern」
點擊左上角的」Discover」按鈕,便可看到最新的日誌信息
至此,咱們已經能夠在ELK上查到Nginx的訪問日誌了
tomcat
安裝和啓動Tomcat
確保nginx-server電腦上已經安裝了JDK8;
在/usr/local/work/目錄下執行如下命令,下載Tomcat:
wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.85/bin/apache-tomcat-7.0.85.zip
解壓縮:unzip apache-tomcat-7.0.85.zip
給腳本賦予可執行權限:chmod a+x /usr/local/work/apache-tomcat-7.0.85/bin/*.sh
啓動:/usr/local/work/apache-tomcat-7.0.85/bin/startup.sh
瀏覽器訪問:http://192.168.119.133:8080
訪問Tomcat提供的example服務的子頁面:http://192.168.119.133:8080/examples/servlets/servlet/RequestInfoExample
至此,Tomcat已經啓動成功,接下來將Tomcat的訪問日誌接入ELK
Tomcat訪問日誌接入ELK
打開FileBeat的配置文件/usr/local/work/filebeat-6.2.3-linux-x86_64/filebeat.yml,在」filebeat.prospectors:」下面新增一個配置節點,內容以下:
- type: log
enabled: true
paths:
- /usr/local/work/apache-tomcat-7.0.85/logs/localhost_access_log.*.txt
停掉filebeat服務,再用./filebeat -e -c filebeat.yml -d 「publish」命令啓動filebeat服務;
此時在Kibana頁面已經能夠搜索到Tomcat的訪問日誌,以「RequestInfoExample」做爲關鍵詞搜索也能搜到對應的訪問日誌
至此,ELK-6.2.3版本的服務和日誌上報的搭建已經完成,後續若是還有業務服務器要上報日誌,只需按照上述步驟安裝和配置FileBeat便可
ELK官網下載地址