ELK實(shí)時(shí)日志分析平臺(tái)的搭建部署及使用

一、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ù)日志。


ELK架構(gòu)圖

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ù)器上。

第二種方法:FQDN(DNS)

直接利用以下命令來生成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功能可定制如下圖表展示:


賬戶落在不同薪水范圍的比率,最外圈表示按薪水所有者的年齡拆分


每個(gè)劇臺(tái)前幕后的數(shù)量


可視化一些地理數(shù)據(jù)

本文原創(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容