目錄
ELK的概念
ELK是Elasticsearch、Logstash、Kibana三大開源框架首字母大寫簡稱。市面上也被成爲Elastic Stack。其中Elasticsearch是一個基於Lucene、分佈式、通過Restful方式進行交互的近實時搜索平臺框架。像類似百度、谷歌這種大數據全文搜索引擎的場景都可以使用Elasticsearch作爲底層支持框架,可見Elasticsearch提供的搜索能力確實強大,市面上很多時候我們簡稱Elasticsearch爲es。Logstash是ELK的中央數據流引擎,用於從不同目標(文件/數據存儲/MQ)收集的不同格式數據,經過過濾後支持輸出到不同目的地(文件/MQ/redis/elasticsearch/kafka等)。Kibana可以將elasticsearch的數據通過友好的頁面展示出來,提供實時分析的功能。
安裝docker-compose
參考文章 Docker搭建RabbitMQ
編寫docker-compose.yml
version: '3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.1.1
container_name: elasticsearch7.1.1
ulimits: # 棧內存的上限
memlock:
soft: -1 # 不限制
hard: -1 # 不限制
hostname: elasticsearch
restart: always
environment:
- node.name=node-1
- node.master=true
- http.port=9200
- cluster.initial_master_nodes=node-1
- http.cors.enabled=true
- http.cors.allow-origin=*
ports:
- 9200:9200
- 9300:9300
networks:
envdm:
aliases:
- elasticsearch
kibana:
image: docker.elastic.co/kibana/kibana:7.1.1
container_name: kibana7.1.1
environment:
XPACK_MONITORING_ENABLED: "true"
XPACK_MONITORING_UI_CONTAINER_ELASTICSEARCH_ENABLED: "true"
ELASTICSEARCH_HOSTS: http://172.16.0.7:9200
CSP_STRICT: "true"
SERVER_BASEPATH: "/kbstatic"
I18N_LOCALE: "zh-CN"
depends_on:
- elasticsearch
restart: always
ports:
- 5601:5601
volumes:
- /data/elk/kibana.yml:/etc/kibana/kibana.yml
networks:
envdm:
aliases:
- kibana
logstash:
image: docker.elastic.co/logstash/logstash:7.1.1
container_name: logstash7.1.1
hostname: logstash
restart: always
depends_on:
- elasticsearch
volumes:
- /data/elk/logstash.conf:/etc/logstash/conf.d/logstash.conf
- /data/elk/logstash.yml:/etc/logstash/logstash.yml
ports:
- 9600:9600
- 5044:5044
networks:
envdm:
aliases:
- logstash
networks:
envdm:
driver: bridge
執行build
編寫好docker-compose.yml之後再同級目錄下面執行如下腳本
docker-compose build
創建配置文件
這裏我們把容器內部的配置文件掛在宿主機裏面
touch kibana.yml logstash.yml logstash.conf
啓動容器
nohup docker-compose up 1>elk.log 2>&1 &
logstash的配置需要進入容器內部 修改修改pipline.yml裏面的配置文件路徑,不然會使用默認的配置文件,導致容器掛載不生效
安裝filebeat
下面列舉了兩種安裝方式,取其一即可
rpm:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.1.1-x86_64.rpm
sudo rpm -vi filebeat-7.1.1-x86_64.rpm
tar:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.1.1-darwin-x86_64.tar.gz
tar xzvf filebeat-7.1.1-darwin-x86_64.tar.gz
cd filebeat-7.1.1-darwin-x86_64/
filebeat 配置
type : 當前輸入數據源的類型
enabled:啓用當前輸入
paths: 路徑數組,數據源的路徑
tags:標籤,可用於的logstash裏面區分數據來源
tail_files : 從文件尾部開始輸入
fields:可以添加自定義子字段
字符編碼配置
在日誌輸出的時候有可能會出現中文亂碼的情況,我們需要配置一下編碼
多行合併配置
配置多行合並可以用於把多行記錄合併爲一行記錄,最典型的就是我們的異常堆棧信息
#java異常信息的處理
multiline.pattern: '^[[:space:]]+(at|\.{3})\b|^Caused by:'
multiline.negate: false
multiline.match: after
logstash配置
logstash的配置類似於管道的模式。
首先是input,標識輸入的數據源,這裏配置的是filebeat
然後是filter 裏面可以使用grok對日誌進行格式化,具體使用可以搜索grok表達式,或者使用正則表達式
也可以使用mutate刪除指定字段,output是把處理之後的日誌輸出到指定的目標位置,可以是ES
# 接受filebeat的日誌輸入
input{
beats {
port => 5044
}
}
filter {
# 格式化日誌信息
grok{
match => {"message" => "%{TIMESTAMP_ISO8601:time}%{SPACE}%{LOGLEVEL:level}%{SPACE}%{NUMBER:pid}\s*%{DATA:no1}\s*\[%{DATA:thread}]\s*%{DATA:path}\s*\:\s*%{GREEDYDATA:msg}"}
}
# 刪除無關字段
mutate {
remove_field => ["host","tags","no1","beat","@version","prospector","input"]
}
}
output{
# 輸出到ES
if "back-base-data"==[fields][type] {
elasticsearch {
hosts => ["172.16.0.7:9200"]
index => "back-basedata-index"
}
}
else if "back-customer-portal"==[fields][type] {
elasticsearch {
hosts => ["172.16.0.7:9200"]
index => "back-customer-portal-index"
}
}
else if "back-system-config"==[fields][type] {
elasticsearch {
hosts => ["172.16.0.7:9200"]
index => "back-system-config-index" }
}
else if "back-customer-management"==[fields][type] {
elasticsearch {
hosts => ["172.16.0.7:9200"]
index => "back-customer-management-index"
}
}
else if "back-suppliers-management"==[fields][type] {
elasticsearch {
hosts => ["172.16.0.7:9200"]
index => "back-suppliers-management-index"
}
}
}
}
完成
上面啓動好elk之後就可以進入kibana控制檯界面,我們先要在kibana的配置模塊裏面找到索引配置,配置好對應的索引模式,這裏我就配置了一個back*的索引模式,配置好之後可以kibana查看數據
至於後面怎麼去對數據進行統計分析就看你自己的了
最後說一點
搭建這個東西不難,但是用好這個東西,從裏面提取出有價值有意義的數據缺失是一件不容易的事情,所以我們作爲開發人員在開發的時候應該要學會規範的打日誌,一些無用的日誌只會讓系統看起來亂糟糟