简介
在微服务日趋流行的今天,应用数量是直线上升,同时为了达到高可用、大流量等还会同一应用部署多个实例。这样一来,想要查看分散在各个主机上的日志,就要在不同的主机控制台之间来回切换,并且要记住每个应用及不同实例所在的主机,ELK的出现,替我们解决了上述各种困扰
更新进度
- 2019-07-11 更新filebeat支持多日志输入以及多日志输出到elasticsearch并自动创建对应索引
- 2019-07-17 更新logstash合并多行日志,精准过滤日志,提取日志以及使用日志中的时间戳替换自带的@timestamp解决微小时间误差带来的排序问题
整体架构图
注:下面均采用6.4.3版本安装及部署
Filebeat
安装filebeat
对比了docker下6.X版的filebeat和安装版的filebeat,发现docker版存在问题,故先使用rpm安装filebeat,下面的都是基于docker安装
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.4.3-x86_64.rpm
rpm -ivh filebeat-6.4.3-x86_64.rpm
配置filebeat
cd /etc/filebeat
vim filebeat.yml
下面是两块核心配置input和output,其他都可以注释掉,我只保留了这两块
如果你的日志生成编码不是utf-8,而是默认的ANSI,就添加编码配置
这里有个坑要提醒一下
log_topics不能使用大写字母,否则数据到了logstash无法输出到elasticsearch,会报我上面截图的错,我也是慢慢排查出来的
下面是完整的配置文件
#=========================== Filebeat inputs =============================
filebeat.inputs:
# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.
- type: log
# Change to true to enable this input configuration.
enabled: true
# Paths that should be crawled and fetched. Glob based paths.
paths:
- xxx #日志路径
fields:
log_topics: wxj-tomcat #注册到kafka上的消息名称,消费需要对应名称 切记!不能用大写
encoding: gbk #如果你的日志编码格式是utf-8,就不需要这行 下面同
- type: log
enabled: true
paths:
- xxx
fields:
log_topics: wxj-nginx
#------------------------------- kafka output --------------------------------
output.kafka:
hosts: ["192.168.10.208:9092"]
topic: 'elk-%{[fields][log_topics]}'
启动filebeat
启动filebeat
systemctl start filebeat.service
查看filebeat状态
systemctl status filebeat.service
查看filebeat日志
tail -f /var/log/filebeat/filebeat
这样就是启动成功了,如果还没配kafka的,先看下面
Kafka
kafka是结合zookeeper一起使用的,kafka通过zookeeper管理集群配置,选举leader,以及在consumer group发生变化时进行rebalance。producer使用push模式将消息发布到broker,consumer使用pull模式从broker订阅并消费消息,其中,filebeat充当producer,logstash充当consumer
安装并运行zookeeper
docker pull zookeeper:latest
docker run -d --name zookeeper -p 2181:2181 -t zookeeper:latest
安装并运行kafka------请把ip改成自己对应的ip
docker pull wurstmeister/kafka:latest
docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0
-e KAFKA_ZOOKEEPER_CONNECT=192.168.10.208:2181
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.10.208:9092
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka:latest
测试filebeat和kafka
下面测试一下日志上到kafka没有,利用kafka tools工具可以方便的查看
如果你没有工具或者懒得去下载,我们直接进入容器内部查看
前面在filebeat配置的topic已经上来了,然后我输出点日志
可以看到数据已经上到kafka了
Logstash
logstash作为elasicsearch常用的实时数据采集引擎,可以采集来自不同数据源的数据,并对数据进行处理后输出到多种输出源,是elasticstack的重要组成部分。
安装logstash
docker pull docker.elastic.co/logstash/logstash:6.4.3
配置logstash
注意看我在/usr/share下创建了一个logstash的文件夹,里面包含一个config和一个pipeline文件夹
下面贴一下我简单配置的logstash.yml和pipeline.yml
logstash.yml
pipeline.yml
下面这个是/usr/share/logstash下的pipeline文件夹
logstash-test.conf
这是我的日志格式格式
结构是 时间戳+日志等级+类名+日志信息,注意下面这个配置比较重要,其中的filter也是logstash的重点
下面是完整的配置文件
input{
kafka{
bootstrap_servers => "192.168.10.208:9092"
topics_pattern => "elk-.*"
consumer_threads => 5
decorate_events => true
codec => "json"
auto_offset_reset => "latest"
}
}
filter {
multiline {
pattern => "^[2]"
negate => true
what => "previous"
}
grok {
match => {
"message" => "%{TIMESTAMP_ISO8601:access_time} %{LOGLEVEL:loglevel} *(?<content>.*)"
}
}
mutate {
remove_field => "message"
}
date {
match => ["access_time", "YYYY-MM-dd;HH:mm:ss,SSS", "ISO8601"]
locale => "en"
target => ["@timestamp"]
timezone => "Asia/Shanghai"
}
}
output {
elasticsearch {
hosts => ["192.168.10.208:9200"]
index => "%{[@metadata][topic]}-%{+YYYY-MM-dd}"
}
}
运行logstash------注意下面我映射的配置文件路径,如果你放的不是和我同个地方,请修改每个-v后面,冒号前面的路径,配置文件均在上方展示
docker run -d -it --name logstash
-v /usr/share/logstash/pipeline/:/usr/share/logstash/pipeline/
-v /usr/share/logstash/config/:/usr/share/logstash/config/ docker.elastic.co/logstash/logstash:6.4.3
注:因为使用了multiline合并插件,如果直接运行可能会报不识别,这时候要进去容器安装一下,进入容器后执行下面的命令等待安装完成即可
/usr/share/logstash/bin/logstash-plugin install logstash-filter-multiline
安装完我把容器重新打了一个镜像,这样测试阶段经常要删除重新run的时候就不用重复安装了(docker容器干掉再重新跑一个新的就相当于一个新的容器了,上一次安装的也不会保存下来,除非挂载出来。这些都是docker的基础知识)
这个是docker的简单操作,就不细细描述了,打好镜像还可以上传到网易蜂巢、阿里云等等地方,别人也可以使用你的镜像
ElasticSearch
elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。
安装elasticsearch
docker pull docker.elastic.co/elasticsearch/elasticsearch:6.4.3
配置elasticsearch
我在/usr/share/elasticsearch/config目录下创建了一个elasticsearch.yml
启动elasticsearch
docker run -d -it --name elasticsearch -p 9200:9200 -p 9300:9300
-v/usr/share/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/
elasticsearch.yml
docker.elastic.co/elasticsearch/elasticsearch:6.4.3
下面我再产生点日志,我们看看数据有没有到elasticsearch,elasticsearch查询数据的地址看我下面的截图,192.168.10.208:9200/_search?pretty
Kibana
kibana是一个开源的分析与可视化平台,设计出来用于和elasticsearch一起使用的。你可以用kibana搜索、查看、交互存放在elasticsearch索引里的数据,使用各种不同的图表、表格、地图等kibana能够很轻易地展示高级数据分析与可视化。
安装kibana
docker pull docker.elastic.co/kibana/kibana:6.4.3
配置kibana
我在/usr/share/kibana/config下创建了一个kibana.yml,上面elasticserch的地址改成自己的地址
启动kibana
docker run -d -it --name kibana -p 5601:5601
-v /usr/share/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml docker.elastic.co/kibana/kibana:6.4.3
启动成功后我们来验证一下我们的kibana是否能展示数据
打开192.168.10.208:5601,看到这个页面说明启动成功,简单配置一下discover
prefect,可见我们的数据经过filebeat->kafka->logstash->elasticsearch,最终在kibana上显示出来,我们现在已经适应动态加载,可以在我们需要收集日志的机器上装上filebeat,日志就可以在kibana上展示出来了,如果日志格式有多种,可以部署多一套,或者在logstash的filter上根据index判断再做提取和过滤,后续如果日志量大,还需要在kafka和elasticsearch做集群。如有侵权,请告知我立马删除,如有不对的地方,也欢迎指正!