ELK實時日志分析平臺的搭建部署及使用
一、 ELK初步接觸
1.1 為什么要用ELK
日志主要包括系統日志、應用程序日志和安全日志。系統運維和開發人員可以通過日志了解服務器軟硬件信息、檢查配置過程中的錯誤及錯誤發生的原因。經常分析日志可以了解服務器的負荷,性能安全性,從而及時采取措施糾正錯誤。
通常,日志被分散的儲存不同的設備上。如果你管理數十上百臺服務器,你還在使用依次登錄每臺機器的傳統方法查閱日志。這樣是不是感覺很繁瑣和效率低下。當務之急我們使用集中化的日志管理,例如:開源的syslog,將所有服務器上的日志收集匯總。
集中化管理日志后,日志的統計和檢索又成為一件比較麻煩的事情,一般我們使用grep、awk和wc等Linux命令能實現檢索和統計,但是對于要求更高的查詢、排序和統計等要求和龐大的機器數量依然使用這樣的方法難免有點力不從心。
? Elasticsearch是個開源分布式搜索引擎,它的特點有:分布式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。
? Logstash是一個完全開源的工具,他可以對你的日志進行收集、過濾,并將其存儲供以后使用(如,搜索)。
? Kibana 也是一個開源和免費的工具,它Kibana可以為 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以幫助您匯總、分析和搜索重要數據日志。
以上是ELK架構圖
Elasticsearch下載地址:https://www.elastic.co/downloads/elasticsearch(目前最新版本:5.4.3)
Logstash下載地址:https://www.elastic.co/downloads/logstash(目前最新版本:5.4.3)
Kibana下載地址:https://www.elastic.co/downloads/kibana(目前最新版本:5.4.3)
1.2 Java 8
elasticsearch 推薦使用java8,所以先安裝好java8。
1.3 Elasticsearch
elasticsearch的安全機制不允許用root用戶啟動,故新建用戶elk:elk。
以elk用戶啟動elasticsearch:
1 2 | $ su - elk $ elasticsearch-5.4.3/bin/elasticsearch & |
安裝結束后:curl localhost:9200 返回如下內容表示安裝成功。
1 2 3 4 5 6 7 8 9 10 11 12 13 | { "name" : "aQgGH94", "cluster_name" : "elasticsearch", "cluster_uuid" : "BjFsa-KxQdSnP58Enrr6NA", "version" : { "number" : "5.4.3", "build_hash" : "eed30a8", "build_date" : "2017-06-22T00:34:03.743Z", "build_snapshot" : false, "lucene_version" : "6.5.1" }, "tagline" : "You Know, for Search" } |
安裝過程中可能會出現的問題及解決:http://blog.csdn.net/leehbing/article/details/74627134
1.4 Kibana
修改配置文件kibana-5.4.3-linux-x86_64/config/kibana.yml:
# The Elasticsearch instance to use for all your queries.
elasticsearch.url: “http://localhost:9200”
執行:
1 2 | $ su – elk
$ ./kibana |
1.5 Nginx
前面kibana只能采用localhost訪問,這里利用反向代理使其他機器可以訪問,本文利用nginx來達到這一目的。
修改配置文件nginx/nginx.conf:
將默認的server{}這一段去掉,添加:include conf.d/*.conf;
1 | $ vi nginx/conf.d/kibana.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | server { listen 80; server_name bogon; #機器的hostname # auth_basic "Restricted Access"; # auth_basic_user_file /etc/nginx/htpasswd.users; location / { proxy_pass http://localhost:5601; #范文kibana的地址 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } |
1 | $ ./nginx/sbin/nginx #啟動nginx |
1.6 Logstash
其實它就是一個收集器而已,我們需要為它指定Input和Output(當然Input和Output可以為多個)。
新建索引配置文件
1 2 3 | $ cd logstash-5.4.3/bin $ mkdir conf $ vi conf/logstash-indexer.conf |
1 2 3 4 5 6 7 8 9 10 | input { file { path => ["/var/opt/log/a.log","/var/opt/log/b.log"] } } output { elasticsearch { hosts => ["localhost:9200"] } stdout { codec => rubydebug } } |
上面幾個步驟的意思就是創建一個名為logstash-indexer.conf的配置文件,input{file{…}}部分指定的是日志文件的位置(可以多個文件),一般來說就是應用程序log4j輸出的日志文件。output部分則是表示將日志文件的內容保存到elasticsearch,這里hosts對應的是一個數組,可以設置多個elasticsearch主機,相當于一份日志文件的內容,可以保存到多個elasticsearch中。stdout,則表示終端的標準輸出,方便部署時驗證是否正常運行,驗證通過后,可以去掉。
1 | $ ./logstash -f conf/logstash-indexer.conf #啟動logstash |
稍等片刻,如果看到Logstash startup completed,則表示啟動成功。然后另開一個終端窗口,隨便找個文本編輯工具(比如:vi),向/var/opt/log/a.log里寫點東西,比如:hello world之類,然后保存。觀察logstash的終端運行窗口,是否有東西輸出,如果有以下類似輸出:
1 2 3 4 5 6 7 | { "path" => "/var/opt/log/a.log", "@timestamp" => 2017-07-09T03:17:28.001Z, "@version" => "1", "host" => "bogon", "message" => "hello word" } |
在瀏覽器中輸入http://192.168.1.139,即會跳轉至kibana頁面,首次運行,會提示創建index,直接點擊Create按鈕即可。
二、 應用場景示例
2.1 收集多個服務器的日志
在客戶服務器安裝Filebeat,將日志發送給logstash。
2.1.1 生成SSL認證
因為要使用Filebeat將日志從客戶端發送到ELK,所以需要創建SSL認證和秘鑰對。Filebeat會使用該認證來識別ELK。有兩種方法來生成SSL認證。如果已經有DNS設置,即可以使客戶端識別ELK服務端的IP地址,使用第二種方法,否則使用第一種方法。
第一種方法:IP地址
如果沒有DNS設置(DNS的設置可以讓產生日志的客戶端服務器來識別ELK服務器的IP地址),必須將ELK服務器的IP地址添加到SSL認證的subjectAltName(SAN)域中。
$ vi /etc/pki/tls/openssl.cnf #編輯OpenSSl的配置文件
找到[ v3_ca ]段,在其下加入subjectAltName = IP: ELK_server_private_ip(ELK_server_private_ip為ELK的IP地址)
利用以下命令來生成SSL認證以及私鑰
1 2 | $ cd /etc/pki/tls #在/etc/pki/tls/目錄下 $ openssl req -config /etc/pki/tls/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt |
第二種方法:FQDN (DNS)
直接利用以下命令來生成SSL認證以及私鑰(在/etc/pki/tls/目錄下)(ELK_server_fqdn:ELK服務器的FQDN)
1 2 | $ cd /etc/pki/tls $ openssl req -subj '/CN=ELK_server_fqdn/' -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt |
2.1.2 配置logstash
Logstash的配置文件采用json的格式,配置文件包括三個部分:inputs,filters,outputs。
1 | $ vi bin/conf/02-beats-input.conf |
1 2 3 4 5 6 7 8 | input { beats { port => 5044 ssl => true ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt" ssl_key => "/etc/pki/tls/private/logstash-forwarder.key" } } |
描述一個beats輸入,監聽tcp端口5044,并且會利用前面創建的ssl認證即秘鑰
1 | $ vi bin/conf/10-syslog-filter.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 | filter { if [type] == "syslog" { grok { match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" } add_field => [ "received_at", "%{@timestamp}" ] add_field => [ "received_from", "%{host}" ] } syslog_pri { } date { match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ] } } } |
對syslog類型(Filebeat進行標記)的日志進行過濾,并利用grok將輸入的syslog日志解析
以使之結構化并且利于查詢。
1 | $ vi bin/conf/30-elasticsearch-output.conf |
1 2 3 4 5 6 7 8 9 | output { elasticsearch { hosts => ["localhost:9200"] sniffing => true manage_template => false index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}" document_type => "%{[@metadata][type]}" } } |
將beats數據存儲到elasticsearch(localhost:9200)并設置了index和type
如果要為其他使用Filebeats輸入的應用添加filter,請確保將這些文件正確命名,以使該文件的順序位于input和output文件之間(比如在02-和30-之間)
2.1.3 加載kibana儀表盤
elastic提供了一些kibana儀表盤和Beats索引模式的樣例,雖然本文不會使用這些儀表盤,但是還是會加載這些儀表盤,因為我們可以使用它們包含的Filebeat索引模式。
下載儀表盤樣例文件:
1 2 3 4 5 | $ curl -L -O https://download.elastic.co/beats/dashboards/beats-dashboards-1.1.0.zip $ yum -y install unzip #安裝unzip $ unzip beats-dashboards-*.zip $ cd beats-dashboards-* $./load.sh #加載儀表盤樣例 |
剛剛加載了如下索引模式:
1 2 3 4 | [packetbeat-]YYYY.MM.DD [topbeat-]YYYY.MM.DD [filebeat-]YYYY.MM.DD [winlogbeat-]YYYY.MM.DD |
當使用kibana的時候,將選擇Filebeat索引模式作為默認。
2.1.4 加載Filebeat索引模板
因為打算使用FIlebeats來將日志送至elasticsearch,應該加載Filebeat索引模板。這個索引模板將會配置elasticsearch以機智的方式來分析送進來的Filebeat字段。
1 2 | $ curl -O https://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/raw/d8c479e2a1adcea8b1fe86570e42abab0f10f364/filebeat-index-template.json #下載Filebeat索引模板 $ curl -XPUT 'http://localhost:9200/_template/filebeat?pretty' -d@filebeat-index-template.json #加載此模板 |
現在ELK服務器已經準備好接受Filebeat數據。
2.1.5 在Client主機上安裝FileBeat軟件包
復制SSL認證
在ELK服務器上,拷貝之前創建的SSL證書到客戶端服務器上。
1 | $ scp /etc/pki/tls/certs/logstash-forwarder.crt user@client_server_private_address:/tmp |
在客戶機上:
1 2 | $ mkdir -p /etc/pki/tls/certs $ cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/ |
安裝Filebeat包
準備好filebeat-5.5.0-linux-x86_64.tar.gz
配置Filebeat
配置Filebeat來連接到Logstash
在客戶服務器上:
1 | $ vi filebeat/filebeat.yml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | filebeat: prospectors: #定義了哪些日志文件可以被傳送給Logstash,并且該如何處理它們 - #表示開始定義prospector paths: - /var/log/secure #表示傳送secure和messages日志 - /var/log/messages # - /var/log/*.log input_type: log document_type: syslog #傳送的日志類型為syslog,其也是Logstash過濾器配置的 registry_file: /var/lib/filebeat/registry output: logstash: hosts: ["elk_server_private_ip:5044"] #ELK服務器的IP,發送至Loastash bulk_max_size: 1024 tls: # List of root certificates for HTTPS server verifications certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"] shipper: logging: files: rotateeverybytes: 10485760 # = 10MB |
注意,Filebeat的配置文件是YAML格式的,所以空格數是很重要的。
現在Filebeat就會發送客戶服務器上的syslog messages and secure文件到ELK服務器!其他的客戶端服務器一樣配置。
2.2 kibana案例數據
這里直接將數據導入elasticsearch,即假設數據源的數據已經存儲到elasticsearch中,然后利用kibana來對數據進行可視化。
導入以下三種數據:
1. 莎士比亞的所有著作,合適地解析成了各個字段:shakespeare.json。
2. 隨機生成的虛構賬號數據:accounts.json
3. 隨機生成的日志文件:logs.jsonl
shakespear.json的數據格式如下:
1 2 3 4 5 6 7 8 | { "line_id": INT, "play_name": "String", "speech_number": INT, "line_number": "String", "speaker": "String", "text_entry": "String", } |
accounts.json的數據格式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | { "account_number": INT, "balance": INT, "firstname": "String", "lastname": "String", "age": INT, "gender": "M or F", "address": "String", "employer": "String", "email": "String", "city": "String", "state": "String" } |
logs.jsonl的主要數據格式如下:
1 2 3 4 5 | { "memory": INT, "geo.coordinates": "geo_point" "@timestamp": "date" } |
在kibana界面建立三個索引模式,分別對應剛剛導入es的索引:
1 2 3 | logstash-2015.05* -> logs.jsonl bank* -> account.json shakes* -> shakespear |
然后利用kibana的visualize功能可定制如下圖表展示:
圖 賬戶落在不同薪水范圍的比率,最外圈表示按薪水所有者的年齡拆分
圖每個劇臺前幕后的數量
圖可視化一些地理數據