一、ELK簡介
ELK就是一款非常優秀的、開源的、用於搭建實時日誌分析平臺的組件。ELK是Elasticsearch、Logstash和Kiabana這3款開源框架首字母的縮寫。通過這三個組件,構建一個統一的日誌管理系統,用來收集分佈式部署系統中分散在不同設備上的日誌,方便後續進行日誌分析。
其中,Elasticsearch是一個實時的分佈式搜索和分析引擎,建立在全文搜索引擎Apache Lucene基礎之上,使用Java語言編寫,具有分佈式、高可用性、易擴展、具有副本和索引自動分片功能、提供基於HTTP協議以JSON爲數據交互格式的REST風格API、多數據源、實時分析存儲等特點。
Logstach主要用於對日誌進行收集、過濾,對數據進行格式化處理,並將所收集的日誌傳輸到相關係統進行存儲。Logstash是用Ruby語言開發的,由數據輸入端、過濾器和數據輸出端3部分組成。其中數據輸入端可以從數據源採集數據,過濾器是數據處理層,包括對數據進行格式化處理、數據類型轉換、數據過濾等,支持正則表達式;數據輸出端是將Logstash收集的數據經由過濾器處理後輸出到其他系統,Kafka、HDFS、Elasticsearch等。
Kibana是一款針對Elasticsearch開源分析及可視化平臺,使用node.js開發,可用來搜索,展示存儲在Elasticsearch中的數據。同時提供了豐富的圖表模板,只需通過簡單的配置就可以方便地進行高級數據分析和繪製各種圖表。
其實,在實際的ELK系統中,還需要配置一個日誌收集器,比如FileBeats等。安裝在每臺需要收集日誌的服務器上,將日誌發送給Logstash進行處理,所以Beats是一個“搬運工”,將你的日誌搬運到日誌收集服務器上。這篇博文暫時先不考慮這類組件。
二、需要環境
1、關閉防火牆(生產環境開放對應端口即可)
2、JDK環境,請參考《CentOS7環境安裝jdk、tomcat及其配置環境變量》博文。
三、Elasticsearch安裝
1、下載Elasticsearch,這裏選擇Elasticsearch6.3.1這個版本,命令如下:
#當前目錄:/usr/local/soft/ELKB/
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.1.tar.gz
2、解壓
#當前目錄:/usr/local/soft/ELKB/
tar -zvxf elasticsearch-6.3.1
3、修改配置文件
入門教程,本着儘量使用默認配置的原則,修改配置文件/usr/local/soft/ELKB/elasticsearch-6.3.1//config/elasticsearch.yml文件,添加如下配置即可:
network.host: 192.168.1.8
http.port: 9200
其中,/usr/local/soft/ELKB/elasticsearch-6.3.1/表示elasticsearch-6.3.1解壓後的根目錄,根據實際情況即可。
3、創建啓動elasticsearch的用戶(elasticsearch不能夠使用root用戶啓動)
adduser elkb
# 將es的擁有者和group改爲elk
chown -R elkb:elkb /usr/local/soft/ELKB/elasticsearch-6.3.1/
4、切換用戶(elkb),啓動elasticsearch
#切換用戶
su elkb
#啓動elasticsearch,當前所在目錄/usr/local/soft/ELKB/elasticsearch-6.3.1/
bin/elasticsearch
5、驗證
訪問http://192.168.1.8:9200/,出現如下界面,說明啓動成功。
四、Kibana 安裝
1、下載Kibana ,這裏選擇kibana6.3.1這個版本(和elasticsearch同步),命令如下:
#當前目錄:/usr/local/soft/ELKB/
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.3.1-linux-x86_64.tar.gz
2、解壓
#當前目錄:/usr/local/soft/ELKB/
tar -zvxf kibana-6.3.1-linux-x86_64.tar.gz
3、修改配置文件
修改配置文件/usr/local/soft/ELKB/kibana-6.3.1-linux-x86_64/config/kibana.yml文件,添加如下配置即可:
# Kibana 端口
server.port: 5601
# Kibana ip
server.host: "192.168.1.8"
# elasticsearch 地址
elasticsearch.url: "http://192.168.1.8:9200"
4、啓動
#啓動kebana,當前目錄/usr/local/soft/ELKB/kibana-6.3.1-linux-x86_64
bin/kibana
5、驗證
訪問http://192.168.1.8:5601,出現如下界面,說明成功。
五、Logstash 安裝
1、下載Logstash ,這裏選擇Logstash6.3.1 這個版本(和elasticsearch同步),命令如下:
#當前目錄:/usr/local/soft/ELKB/
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.3.1.tar.gz
2、解壓
#當前目錄:/usr/local/soft/ELKB/
tar -zxvf logstash-6.3.1.tar.gz
3、驗證
在/usr/local/soft/ELKB/logstash-6.3.1目錄下,通過執行bin/logstash -e ‘input { stdin { } } output { stdout {} }’,然後在輸入hello,出現如下界面說明,logstash可以正常使用。
#當前目錄:/usr/local/soft/ELKB/logstash-6.3.1
[root@node08 logstash-6.3.1]# bin/logstash -e 'input { stdin { } } output { stdout {} }'
hello #
Sending Logstash's logs to /usr/local/soft/ELKB/logstash-6.3.1/logs which is now configured via log4j2.properties
[2020-05-14T13:23:50,509][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.queue", :path=>"/usr/local/soft/ELKB/logstash-6.3.1/data/queue"}
[2020-05-14T13:23:50,534][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.dead_letter_queue", :path=>"/usr/local/soft/ELKB/logstash-6.3.1/data/dead_letter_queue"}
[2020-05-14T13:23:51,495][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2020-05-14T13:23:51,699][INFO ][logstash.agent ] No persistent UUID file found. Generating new UUID {:uuid=>"95edb338-9c94-47d4-b357-4406ffa6ba33", :path=>"/usr/local/soft/ELKB/logstash-6.3.1/data/uuid"}
[2020-05-14T13:23:52,846][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"6.3.1"}
[2020-05-14T13:23:55,728][INFO ][logstash.pipeline ] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>4, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50}
[2020-05-14T13:23:56,398][INFO ][logstash.pipeline ] Pipeline started successfully {:pipeline_id=>"main", :thread=>"#<Thread:0x55098452 run>"}
The stdin plugin is now waiting for input:
[2020-05-14T13:23:56,532][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
{
"message" => "hello",
"@version" => "1",
"@timestamp" => 2020-05-14T05:23:56.445Z,
"host" => "node08"
}
[2020-05-14T13:23:57,375][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
六、示例
通過上述步驟,已經完成了三個組件的安裝工作,下面來實現讀取nginx訪問日誌,並寫入到ES中的例子,保證存在/usr/local/nginx/logs/access.log訪問日誌(目錄可以隨意),用來作爲logstash採集日誌的來源。
1、配置logstash採集處理日誌的配置
在/usr/local/soft/ELKB/logstash-6.3.1目錄,創建job目錄(目錄自定義,可以隨意),然後進入目錄創建一個nginx.conf文件,內容如下:
input {#配置日誌來源,使用固定文件的方式
file{
path => "/usr/local/nginx/logs/access.log"
start_position => "beginning"
type => "nginx_access_log"
}
}
filter {
if [type] == "nginx" { # 這裏的type是日誌類型
grok {
match => { "message" => "%{COMBINEDAPACHELOG} %{QS:gzip_ratio}" } # 使用自帶的pattern即可,注意空格
}
# 更改匹配到的字段的數據類型
mutate {
convert => ["response", "integer"]
convert => ["bytes", "integer"]
convert => ["responsetime", "float"]
}
# 指定時間戳字段以及具體的格式
date {
match => ["timestamp", "dd/MMM/YYYY:HH:mm:ss Z"]
remove_field => ["timestamp"]
}
}
}
output {#配置elasticsearch作爲輸出目的地
elasticsearch {
hosts => [ "192.168.1.8:9200" ]
index => "%{type}-%{+YYYY.MM.dd}" # index中含有時間戳
}
}
2、根據上述nginx.conf文件重新啓動logstash,命令如下:
#當前目錄:/usr/local/soft/ELKB/logstash-6.3.1下,執行如下命令
# bin/logstash -f job/nginx.conf
注意:執行較慢,需要等待。
3、配置ES的Index的Mapping信息
通過執行如下命令即可。
curl -H "Content-Type: application/json" -XPUT 192.168.1.8:9200/_template/nginx -d '
{
"template": "nginx*",
"mappings": {
"_default_": {
"properties": {
"clientip": {
"type": "keyword"
},
"ident": {
"type": "keyword"
},
"auth": {
"type": "keyword"
},
"verb": {
"type": "keyword"
},
"request": {
"type": "keyword"
},
"httpversion": {
"type": "keyword"
},
"rawrequest": {
"type": "keyword"
},
"response": {
"type": "keyword"
},
"bytes": {
"type": "integer"
},
"referrer": {
"type": "keyword"
},
"agent": {
"type": "keyword"
},
"gzip_ratio": {
"type": "keyword"
}
}
}
}
}'
4、使用Kibana查看Elasticsearch索引數據
- 通過訪問【http://192.168.1.8:5601】打開Kibana界面,找到Management菜單,如下圖所示:
- 創建索引的匹配規則(正則表達式),點擊下一步
- 創建索引,選擇“I don’t want to use the Time Filter”,然後點擊創建按鈕。
- 點擊創建後,進入如下頁面,說明創建成功
- 點擊Disconer菜單,這個時候,就可以看到了nginx訪問日誌中數據了,如下所示。
七、寫在最後
在這篇博文中,我們只是簡單的演示瞭如何部署ELK中的三個組件,和配置了一個簡單讀取nginx訪問日誌的示例,下一篇文章中,我們將引入FileBeats組件,從而真正實現動態讀取在多臺服務器上的日誌文件。
在另外一篇博文中,專門記錄了在安裝部署ELK過程中遇見的問題和解決方案,請參考《在搭建ELK日誌分析系統中的常見問題和解決方案》。