一、ELK初步接觸
1.1為什么要用ELK
日志主要包括系統(tǒng)日志、應(yīng)用程序日志和安全日志。系統(tǒng)運(yùn)維和開發(fā)人員可以通過日志了解服務(wù)器軟硬件信息、檢查配置過程中的錯(cuò)誤及錯(cuò)誤發(fā)生的原因。經(jīng)常分析日志可以了解服務(wù)器的負(fù)荷,性能安全性,從而及時(shí)采取措施糾正錯(cuò)誤。
通常,日志被分散的儲(chǔ)存不同的設(shè)備上。如果你管理數(shù)十上百臺(tái)服務(wù)器,你還在使用依次登錄每臺(tái)機(jī)器的傳統(tǒng)方法查閱日志。這樣是不是感覺很繁瑣和效率低下。當(dāng)務(wù)之急我們使用集中化的日志管理,例如:開源的syslog,將所有服務(wù)器上的日志收集匯總。
集中化管理日志后,日志的統(tǒng)計(jì)和檢索又成為一件比較麻煩的事情,一般我們使用grep、awk和wc等Linux命令能實(shí)現(xiàn)檢索和統(tǒng)計(jì),但是對(duì)于要求更高的查詢、排序和統(tǒng)計(jì)等要求和龐大的機(jī)器數(shù)量依然使用這樣的方法難免有點(diǎn)力不從心。
·Elasticsearch是個(gè)開源分布式搜索引擎,它的特點(diǎn)有:分布式,零配置,自動(dòng)發(fā)現(xiàn),索引自動(dòng)分片,索引副本機(jī)制,restful風(fēng)格接口,多數(shù)據(jù)源,自動(dòng)搜索負(fù)載等。
·Logstash是一個(gè)完全開源的工具,他可以對(duì)你的日志進(jìn)行收集、過濾,并將其存儲(chǔ)供以后使用(如,搜索)。
·Kibana也是一個(gè)開源和免費(fèi)的工具,它Kibana可以為L(zhǎng)ogstash和ElasticSearch提供的日志分析友好的Web界面,可以幫助您匯總、分析和搜索重要數(shù)據(jù)日志。

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.2Java 8
elasticsearch推薦使用java8,所以先安裝好java8。
1.3Elasticsearch
elasticsearch的安全機(jī)制不允許用root用戶啟動(dòng),故新建用戶elk:elk。
以elk用戶啟動(dòng)elasticsearch:
$ su - elk
$ elasticsearch-5.4.3/bin/elasticsearch &
安裝結(jié)束后:curl localhost:9200返回如下內(nèi)容表示安裝成功。
"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, forSearch"
}
安裝過程中可能會(huì)出現(xiàn)的問題及解決:http://blog.csdn.net/leehbing/article/details/74627134
1.4Kibana
修改配置文件kibana-5.4.3-linux-x86_64/config/kibana.yml:
# The Elasticsearch instance to use forall your queries.
elasticsearch.url:"http://localhost:9200"
執(zhí)行:
$ su–elk
$ ./kibana
1.5Nginx
前面kibana只能采用localhost訪問,這里利用反向代理使其他機(jī)器可以訪問,本文利用nginx來達(dá)到這一目的。
修改配置文件nginx/nginx.conf:
將默認(rèn)的server{}這一段去掉,添加:includeconf.d/*.conf;
$ vinginx/conf.d/kibana.conf
server {
listen 80;
server_name bogon;#機(jī)器的hostname
#auth_basic "Restricted Access";
#auth_basic_user_file /etc/nginx/htpasswd.users;
location / {
proxy_passhttp://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;
}
}
$./nginx/sbin/nginx#啟動(dòng)nginx
1.6Logstash

其實(shí)它就是一個(gè)收集器而已,我們需要為它指定Input和Output(當(dāng)然Input和Output可以為多個(gè))。
新建索引配置文件
$ cd logstash-5.4.3/bin
$ mkdir conf
$ vi conf/logstash-indexer.conf
input {
file {
path =>["/var/opt/log/a.log","/var/opt/log/b.log"]
}
}
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}
上面幾個(gè)步驟的意思就是創(chuàng)建一個(gè)名為logstash-indexer.conf的配置文件,input{file{...}}部分指定的是日志文件的位置(可以多個(gè)文件),一般來說就是應(yīng)用程序log4j輸出的日志文件。output部分則是表示將日志文件的內(nèi)容保存到elasticsearch,這里hosts對(duì)應(yīng)的是一個(gè)數(shù)組,可以設(shè)置多個(gè)elasticsearch主機(jī),相當(dāng)于一份日志文件的內(nèi)容,可以保存到多個(gè)elasticsearch中。stdout,則表示終端的標(biāo)準(zhǔn)輸出,方便部署時(shí)驗(yàn)證是否正常運(yùn)行,驗(yàn)證通過后,可以去掉。
$ ./logstash -fconf/logstash-indexer.conf#啟動(dòng)logstash
稍等片刻,如果看到Logstash
startup completed,則表示啟動(dòng)成功。然后另開一個(gè)終端窗口,隨便找個(gè)文本編輯工具(比如:vi),向/var/opt/log/a.log里寫點(diǎn)東西,比如:hello world之類,然后保存。觀察logstash的終端運(yùn)行窗口,是否有東西輸出,如果有以下類似輸出:
{
"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,即會(huì)跳轉(zhuǎn)至kibana頁面,首次運(yùn)行,會(huì)提示創(chuàng)建index,直接點(diǎn)擊Create按鈕即可。

二、 應(yīng)用場(chǎng)景示例
2.1收集多個(gè)服務(wù)器的日志
在客戶服務(wù)器安裝Filebeat,將日志發(fā)送給logstash。

2.1.1生成SSL認(rèn)證
因?yàn)橐褂肍ilebeat將日志從客戶端發(fā)送到ELK,所以需要?jiǎng)?chuàng)建SSL認(rèn)證和秘鑰對(duì)。Filebeat會(huì)使用該認(rèn)證來識(shí)別ELK。有兩種方法來生成SSL認(rèn)證。如果已經(jīng)有DNS設(shè)置,即可以使客戶端識(shí)別ELK服務(wù)端的IP地址,使用第二種方法,否則使用第一種方法。
第一種方法:IP地址
如果沒有DNS設(shè)置(DNS的設(shè)置可以讓產(chǎn)生日志的客戶端服務(wù)器來識(shí)別ELK服務(wù)器的IP地址),必須將ELK服務(wù)器的IP地址添加到SSL認(rèn)證的subjectAltName(SAN)域中。
$ vi/etc/pki/tls/openssl.cnf#編輯OpenSSl的配置文件
找到[ v3_ca ]段,在其下加入subjectAltName
= IP: ELK_server_private_ip(ELK_server_private_ip為ELK的IP地址)
利用以下命令來生成SSL認(rèn)證以及私鑰
$ cd/etc/pki/tls#在/etc/pki/tls/目錄下
$ openssl req -config /etc/pki/tls/openssl.cnf -x509 -days3650-batch -nodes -newkey rsa:2048-keyoutprivate/logstash-forwarder.key -out certs/logstash-forwarder.crt
生成的logstash-forwarder.crt文件將被拷貝到所有發(fā)送日志給logstash的服務(wù)器上。
直接利用以下命令來生成SSL認(rèn)證以及私鑰(在/etc/pki/tls/目錄下)(ELK_server_fqdn:ELK服務(wù)器的FQDN)
$ cd /etc/pki/tls
$ openssl req -subj'/CN=ELK_server_fqdn/'-x509 -days3650-batch
-nodes -newkey rsa:2048-keyoutprivate/logstash-forwarder.key-out certs/logstash-forwarder.crt
2.1.2配置logstash
Logstash的配置文件采用json的格式,配置文件包括三個(gè)部分:inputs,filters,outputs。
$ vi bin/conf/02-beats-input.conf
input {
beats {
port => 5044
ssl => true
ssl_certificate =>"/etc/pki/tls/certs/logstash-forwarder.crt"
ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
}
}
描述一個(gè)beats輸入,監(jiān)聽tcp端口5044,并且會(huì)利用前面創(chuàng)建的ssl認(rèn)證即秘鑰
$ vi bin/conf/10-syslog-filter.conf
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", "MMMd HH:mm:ss", "MMM dd HH:mm:ss"]
}
}
}
對(duì)syslog類型(Filebeat進(jìn)行標(biāo)記)的日志進(jìn)行過濾,并利用grok將輸入的syslog日志解析
以使之結(jié)構(gòu)化并且利于查詢。
$ vi bin/conf/30-elasticsearch-output.conf
output {
elasticsearch {
hosts => ["localhost:9200"]
sniffing => true
manage_template => false
index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}
將beats數(shù)據(jù)存儲(chǔ)到elasticsearch(localhost:9200)并設(shè)置了index和type
如果要為其他使用Filebeats輸入的應(yīng)用添加filter,請(qǐng)確保將這些文件正確命名,以使該文件的順序位于input和output文件之間(比如在02-和30-之間)
2.1.3加載kibana儀表盤
elastic提供了一些kibana儀表盤和Beats索引模式的樣例,雖然本文不會(huì)使用這些儀表盤,但是還是會(huì)加載這些儀表盤,因?yàn)槲覀兛梢允褂盟鼈儼腇ilebeat索引模式。
下載儀表盤樣例文件:
$ 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#加載儀表盤樣例
剛剛加載了如下索引模式:
[packetbeat-]YYYY.MM.DD
[topbeat-]YYYY.MM.DD
[filebeat-]YYYY.MM.DD
[winlogbeat-]YYYY.MM.DD
當(dāng)使用kibana的時(shí)候,將選擇Filebeat索引模式作為默認(rèn)。
2.1.4加載Filebeat索引模板
因?yàn)榇蛩闶褂肍Ilebeats來將日志送至elasticsearch,應(yīng)該加載Filebeat索引模板。這個(gè)索引模板將會(huì)配置elasticsearch以機(jī)智的方式來分析送進(jìn)來的Filebeat字段。
$ 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#加載此模板
現(xiàn)在ELK服務(wù)器已經(jīng)準(zhǔn)備好接受Filebeat數(shù)據(jù)。
2.1.5在Client主機(jī)上安裝FileBeat軟件包
復(fù)制SSL認(rèn)證
在ELK服務(wù)器上,拷貝之前創(chuàng)建的SSL證書到客戶端服務(wù)器上。
$ scp/etc/pki/tls/certs/logstash-forwarder.crtuser@client_server_private_address:/tmp
在客戶機(jī)上:
$ mkdir -p/etc/pki/tls/certs
$ cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/
安裝Filebeat包
準(zhǔn)備好filebeat-5.5.0-linux-x86_64.tar.gz
配置Filebeat
配置Filebeat來連接到Logstash
在客戶服務(wù)器上:
$ vifilebeat/filebeat.yml
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服務(wù)器的IP,發(fā)送至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
注意,F(xiàn)ilebeat的配置文件是YAML格式的,所以空格數(shù)是很重要的。
現(xiàn)在Filebeat就會(huì)發(fā)送客戶服務(wù)器上的syslog messages and secure文件到ELK服務(wù)器!其他的客戶端服務(wù)器一樣配置。
2.2 kibana案例數(shù)據(jù)
這里直接將數(shù)據(jù)導(dǎo)入elasticsearch,即假設(shè)數(shù)據(jù)源的數(shù)據(jù)已經(jīng)存儲(chǔ)到elasticsearch中,然后利用kibana來對(duì)數(shù)據(jù)進(jìn)行可視化。
導(dǎo)入以下三種數(shù)據(jù):
1.莎士比亞的所有著作,合適地解析成了各個(gè)字段:shakespeare.json。
2.隨機(jī)生成的虛構(gòu)賬號(hào)數(shù)據(jù):accounts.json
3.隨機(jī)生成的日志文件:logs.jsonl
shakespear.json的數(shù)據(jù)格式如下:
{
"line_id": INT,
"play_name":"String",
"speech_number": INT,
"line_number":"String",
"speaker":"String",
"text_entry":"String",
}
accounts.json的數(shù)據(jù)格式如下:
{
"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的主要數(shù)據(jù)格式如下:
{
"memory": INT,
"geo.coordinates":"geo_point"
"@timestamp":"date"
}
在kibana界面建立三個(gè)索引模式,分別對(duì)應(yīng)剛剛導(dǎo)入es的索引:
logstash-2015.05*->logs.jsonl
bank*->account.json
shakes*->shakespear
然后利用kibana的visualize功能可定制如下圖表展示:



本文原創(chuàng)首發(fā)于Cobub官網(wǎng)博客,作者:李紅兵
如有轉(zhuǎn)載請(qǐng)注明作者和出處!
推薦一款開源 私有化部署的移動(dòng)應(yīng)用數(shù)據(jù)統(tǒng)計(jì)分析 系統(tǒng)Cobub Razor
開源社區(qū)技術(shù)交流QQ群:194022996