容器日志知多少 (2) 开源日志处理计划 ELK/EFK

本篇已参与《.NET Core on K8S学习实践系列文章索引》,能够点击查看更多容器化技术相关系列文章。上一篇《你有必要知道的容器日志(1)》中介绍了Docker自带的logs子指令以及其Logging driver,本篇将会介绍一个盛行的开源日志处理方案ELK

一、关于ELK

1.1 ELK简介

  ELK 是Elastic公司供应的一套无缺的日志收集以及展示的处理方案,是三个产品的首字母缩写,分别是ElasticSearchLogstashKibana

容器日志知多少 (2) 开源日志处理计划 ELK/EFK

  • Elasticsearch是实时全文查找和分析引擎,供应收集、分析、存储数据三大功用
  • Logstash是一个用来收集、分析、过滤日志的东西
  • Kibana是一个依据Web的图形界面,用于查找、分析和可视化存储在 Elasticsearch方针中的日志数据 

1.2 ELK日志处理流程

容器日志知多少 (2) 开源日志处理计划 ELK/EFK

   上图展示了在Docker环境下,一个典型的ELK方案下的日志收集处理流程:

  • Logstash从各个Docker容器中提取日志信息
  • Logstash将日志转发到ElasticSearch进行索引和保存
  • Kibana担任分析和可视化日志信息

  由于Logstash在数据收集上并不超卓,而且作为Agent,其功用并不合格。依据此,Elastic发布了beats系列轻量级收集组件。

容器日志知多少 (2) 开源日志处理计划 ELK/EFK

  这儿我们要实践的Beat组件是Filebeat,Filebeat是构建于beats之上的,应用于日志收集场景的结束,用来替代 Logstash Forwarder 的下一代 Logstash 收集器,是为了更快速安稳轻量低耗地进行收集作业,它能够很便当地与 Logstash 还有直接与 Elasticsearch 进行对接。

  本次实验直接运用Filebeat作为Agent,它会收集我们在第一篇《Docker logs & logging driver》中介绍的json-file的log文件中的记载改动,并直接将日志发给ElasticSearch进行索引和保存,其处理流程变为下图,你也能够认为它能够称作 EFK

容器日志知多少 (2) 开源日志处理计划 ELK/EFK

二、ELK套件的设备

  本次实验我们选用Docker办法安置一个最小规划的ELK工作环境,当然,实践环境中我们或许需求仔细考虑高可用和负载均衡。

  首要拉取一下sebp/elk这个集成镜像,这儿选择的tag版别是640(最新版别现已是7XX了):

docker pull sebp/elk:640

  注:由于其包含了整个ELK方案,所以需求耐性等候一会。

  通过以下指令运用sebp/elk这个集成镜像发起工作ELK:

docker run -it -d --name elk 
-p 5601:5601 
-p 9200:9200 
-p 5044:5044 
sebp/elk:640

  工作结束之后就能够先访问一下 http://[Your-HostIP]:5601 看看Kibana的效果:  

容器日志知多少 (2) 开源日志处理计划 ELK/EFK

  Kibana处理界面

容器日志知多少 (2) 开源日志处理计划 ELK/EFK

Kibana Index Patterns界面

  当然,现在没有一点能够闪现的ES的索引和数据,再访问一下http://[Your-HostIP]:9200 看看ElasticSearch的API接口是否可用:

容器日志知多少 (2) 开源日志处理计划 ELK/EFK

ElasticSearch API

  _Note:_假设发起过程中发现一些差错,导致ELK容器无法发起,能够参看《Docker发起ElasticSearch报错》及《ElasticSearch发起常见差错》一文。假设你的主机内存低于4G,建议添加配备设置ES内存运用大小,避免发起不了。例如下面添加的配备,束缚ES内存运用最大为1G:

docker run -it -d --name elk 
-p 5601:5601 
-p 9200:9200 
-p 5044:5044 
  -e ES_MIN_MEM=512m 
-e ES_MAX_MEM=1024m 
sebp/elk:640

三、Filebeat配备

3.1 设备Filebeat

  这儿我们通过rpm的办法下载Filebeat,留心这儿下载和我们ELK对应的版别(ELK是6.4.0,这儿也是下载6.4.0,避免出现差错):

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.4.0-x86_64.rpm
rpm -ivh filebeat-6.4.0-x86_64.rpm

3.2 配备Filebeat  

   这儿我们该奉告Filebeat要监控哪些日志文件 及 将日志发送到哪里去,因此我们该批改一下Filebeat的配备:

cd /etc/filebeat
vim filebeat.yml

  要批改的内容为:

  (1)监控哪些日志?

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:
- /var/lib/docker/containers/*/*.log
- /var/log/syslog

  这儿指定paths:/var/lib/docker/containers/_/_.log,其他有必要要格外留心的是将 enabled 设为 true。

  (2)将日志发到哪里?

#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["192.168.16.190:9200"]
# Optional protocol and basic auth credentials.
#protocol: "https"
#username: "elastic"
#password: "changeme"

  这儿指定直接发送到ElasticSearch,配备一下ES的接口地址即可。

  _Note:_假设要发到Logstash,请运用后边这段配备,将其吊销注释进行相关配备即可:

#----------------------------- Logstash output --------------------------------
#output.logstash:
# The Logstash hosts
#hosts: ["localhost:5044"]
# Optional SSL. By default is off.
# List of root certificates for HTTPS server verifications
#ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]
# Certificate for SSL client authentication
#ssl.certificate: "/etc/pki/client/cert.pem"
# Client Certificate Key
#ssl.key: "/etc/pki/client/cert.key"

3.3 发起Filebeat

  由于Filebeat在设备时现已注册为systemd的服务,所以只需求直接发起即可:

systemctl start filebeat.service

  查看Filebeat发起情况:

systemctl status filebeat.service

3.4 验证Filebeat

  通过访问ElasticSearch API能够发现以下改动:ES树立了以filebeat-开始的索引,我们还能清楚看到其来历及具体的message。

容器日志知多少 (2) 开源日志处理计划 ELK/EFK

四、Kibana配备

  接下来我们就要奉告Kibana,要查询和分析ElasticSearch中的哪些日志,因此需求配备一个Index Pattern。从Filebeat中我们我们都知道Index是filebeat-timestamp这种格式,因此这儿我们定义Index Pattern为 filebeat-*

容器日志知多少 (2) 开源日志处理计划 ELK/EFK

  点击Next Step,这儿我们选择Time Filter field name为@timestamp:

容器日志知多少 (2) 开源日志处理计划 ELK/EFK

  单击Create index pattern按钮,即可结束配备。

  这时我们单击Kibana左面的Discover菜单,即可看到容器的日志信息啦:

容器日志知多少 (2) 开源日志处理计划 ELK/EFK

  仔细看看细节,我们注重一下message字段:

容器日志知多少 (2) 开源日志处理计划 ELK/EFK

  能够看到,我们关键要注重的是message,因此我们也能够选择一下只看这个字段的信息:

容器日志知多少 (2) 开源日志处理计划 ELK/EFK

  此外,Kibana还供应了查找关键词的日志功用,例如这儿我注重一下日志中包含unhandled exception(未处理失常)的日志信息:

容器日志知多少 (2) 开源日志处理计划 ELK/EFK

  这儿只是朴素的展示了导入ELK的日志信息,实践上ELK还有许多很丰盛的玩法,例如分析聚合、炫酷Dashboard等等。笔者在这儿也是初步运用,就介绍到这儿啦。

五、Fluentd引入

5.1 关于Fluentd

  前面我们选用的是Filebeat收集Docker的日志信息,依据Docker默许的json-file这个logging driver,这儿我们改用Fluentd这个开源项目来替换json-file收集容器的日志。

  Fluentd是一个开源的数据收集器,专为处理数据流规划,运用JSON作为数据格式。它选用了插件式的架构,具有高可扩展性高可用性,一同还结束了高可靠的信息转发。Fluentd也是云原生基金会 (CNCF) 的成员项目之一,遵照Apache 2 License协议,其github地址为:https://github.com/fluent/fluentd/。Fluentd与Logstash比较,比占用内存更少、社区更生动,两者的对比能够参看这篇文章《Fluentd vs Logstash》。

  因此,整个日志收集与处理流程变为下图,我们用 Filebeat 将 Fluentd 收集到的日志转发给 Elasticsearch。

容器日志知多少 (2) 开源日志处理计划 ELK/EFK

   当然,我们也能够正常的运用Fluentd的插件(fluent-plugin-elasticsearch)直接将日志发送给 Elasticsearch,能够准确的通过自己的需求替换掉Filebeat,然后构成Fluentd => ElasticSearch => Kibana 的架构,也称作EFK

5.2 工作Fluentd

  这儿我们通过容器来工作一个Fluentd收集器:

docker run -d -p 24224:24224 -p 24224:24224/udp -v /edc/fluentd/log:/fluentd/log fluent/fluentd

  默许Fluentd会运用24224端口,其日志会收集在我们映射的途径下。

  此外,我们还需求批改Filebeat的配备文件,将/edc/fluentd/log参与监控目录下:

#=========================== 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:
- /edc/fluentd/log/*.log

  添加监控配备之后,需求从头restart一下filebeat:

systemctl restart filebeat

5.3 工作检验容器

  为了验证效果,这儿我们Run两个容器,并分别拟定其log-dirver为fluentd:

docker run -d 
--log-driver=fluentd 
--log-opt fluentd-address=localhost:24224 
--log-opt tag="test-docker-A" 
busybox sh -c 'while true; do echo "This is a log message from container A"; sleep 10; done;'
docker run -d 
--log-driver=fluentd 
--log-opt fluentd-address=localhost:24224 
--log-opt tag="test-docker-B" 
busybox sh -c 'while true; do echo "This is a log message from container B"; sleep 10; done;'

  这儿通过指定容器的log-driver,以及为每个容器设立了tag,便当我们后边验证查看日志。

5.4 验证EFK效果

  这时再次进入Kibana中查看日志信息,便能够毕竟靠刚刚设置的tag信息选择到刚刚添加的容器的日志信息了:

容器日志知多少 (2) 开源日志处理计划 ELK/EFK

六、小结

  本文从ELK的底子组成下手,介绍了ELK的底子处理流程,以及从0初步树立了一个ELK环境,演示了依据Filebeat收集容器日志信息的案例。然后,通过引入Fluentd这个开源数据收集器,演示了怎样依据EFK的日志收集案例。当然,ELK/EFK有许多的知识点,笔者也还只是初步运用,希望未来能够同享更多的实践总结。

参看材料

CloudMan,《每天5分钟玩转Docker容器技术》

一杯甜酒,《ELK学习总结》

于老三,《快速树立ELK日志分析系统》

zpei0411,《Logstash beats系列 & Fluentd》

曹林华,《从ELK到EFK的演进》