本篇已加入《.NET Core on K8S学习实践系列文章索引》,能够点击查看更多容器化技术相关系列文章。上一篇《你必须知道的容器日志(1)》中介绍了Docker自带的logs子命令以及其Logging driver,本篇将会介绍一个流行的开源日志管理方案ELK。html
ELK 是Elastic公司提供的一套完整的日志收集以及展现的解决方案,是三个产品的首字母缩写,分别是ElasticSearch、Logstash 和 Kibana。git
上图展现了在Docker环境下,一个典型的ELK方案下的日志收集处理流程:github
因为Logstash在数据收集上并不出色,并且做为Agent,其性能并不达标。基于此,Elastic发布了beats系列轻量级采集组件。docker
这里咱们要实践的Beat组件是Filebeat,Filebeat是构建于beats之上的,应用于日志收集场景的实现,用来替代 Logstash Forwarder 的下一代 Logstash 收集器,是为了更快速稳定轻量低耗地进行收集工做,它能够很方便地与 Logstash 还有直接与 Elasticsearch 进行对接。json
本次实验直接使用Filebeat做为Agent,它会收集咱们在第一篇《Docker logs & logging driver》中介绍的json-file的log文件中的记录变更,并直接将日志发给ElasticSearch进行索引和保存,其处理流程变为下图,你也能够认为它能够称做 EFK。vim
本次实验咱们采用Docker方式部署一个最小规模的ELK运行环境,固然,实际环境中咱们或许须要考虑高可用和负载均衡。架构
首先拉取一下sebp/elk这个集成镜像,这里选择的tag版本是640(最新版本已是7XX了):负载均衡
docker pull sebp/elk:640
注:因为其包含了整个ELK方案,因此须要耐心等待一会。elasticsearch
经过如下命令使用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的效果:
Kibana管理界面
Kibana Index Patterns界面
固然,目前没有任何能够显示的ES的索引和数据,再访问一下http://[Your-HostIP]:9200 看看ElasticSearch的API接口是否可用:
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
这里咱们经过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
这里咱们须要告诉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"
因为Filebeat在安装时已经注册为systemd的服务,因此只须要直接启动便可:
systemctl start filebeat.service
检查Filebeat启动状态:
systemctl status filebeat.service
经过访问ElasticSearch API能够发现如下变化:ES创建了以filebeat-开头的索引,咱们还可以看到其来源及具体的message。
接下来咱们就要告诉Kibana,要查询和分析ElasticSearch中的哪些日志,所以须要配置一个Index Pattern。从Filebeat中咱们知道Index是filebeat-timestamp这种格式,所以这里咱们定义Index Pattern为 filebeat-*
点击Next Step,这里咱们选择Time Filter field name为@timestamp:
单击Create index pattern按钮,便可完成配置。
这时咱们单击Kibana左侧的Discover菜单,便可看到容器的日志信息啦:
仔细看看细节,咱们关注一下message字段:
能够看到,咱们重点要关注的是message,所以咱们也能够筛选一下只看这个字段的信息:
此外,Kibana还提供了搜索关键词的日志功能,例如这里我关注一下日志中包含unhandled exception(未处理异常)的日志信息:
这里只是朴素的展现了导入ELK的日志信息,实际上ELK还有不少很丰富的玩法,例如分析聚合、炫酷Dashboard等等。笔者在这里也是初步使用,就介绍到这里啦。
前面咱们采用的是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。
固然,咱们也可使用Fluentd的插件(fluent-plugin-elasticsearch)直接将日志发送给 Elasticsearch,能够根据本身的须要替换掉Filebeat,从而造成Fluentd => ElasticSearch => Kibana 的架构,也称做EFK。
这里咱们经过容器来运行一个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
为了验证效果,这里咱们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,方便咱们后面验证查看日志。
这时再次进入Kibana中查看日志信息,即可以经过刚刚设置的tag信息筛选到刚刚添加的容器的日志信息了:
本文从ELK的基本组成入手,介绍了ELK的基本处理流程,以及从0开始搭建了一个ELK环境,演示了基于Filebeat收集容器日志信息的案例。而后,经过引入Fluentd这个开源数据收集器,演示了如何基于EFK的日志收集案例。固然,ELK/EFK有不少的知识点,笔者也还只是初步使用,但愿将来可以分享更多的实践总结。
CloudMan,《天天5分钟玩转Docker容器技术》
一杯甜酒,《ELK学习总结》
于老三,《快速搭建ELK日志分析系统》
zpei0411,《Logstash beats系列 & Fluentd》
曹林华,《从ELK到EFK的演进》
原文出处:https://www.cnblogs.com/edisonchou/p/docker_logs_study_summary_part2.html