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查看数据
至于后面怎么去对数据进行统计分析就看你自己的了
最后说一点
搭建这个东西不难,但是用好这个东西,从里面提取出有价值有意义的数据缺失是一件不容易的事情,所以我们作为开发人员在开发的时候应该要学会规范的打日志,一些无用的日志只会让系统看起来乱糟糟
转载:https://blog.csdn.net/youzi1394046585/article/details/105599525