本篇文章介绍了一种基于 filebeat,支持 Docker 容器日志采集的解决方案。分别说明了filebeat优势、特性及相关配置。
前言
随着容器技术的发展,越来越多的传统应用将会逐渐容器化。日志作为应用的一个关键环节,尤其是在使用容器编排工具进行容器调度的动态环境下,程序的排错和健康状态的分析很多都依赖日志信息的收集。在容器平台这种动态的环境下,如何在应用的容器化过程中,方便快捷的自动发现和采集日志是将传统应用容器化部署的一个重要方面。
相比于传统日志的采集,容器日志采集主要存在以下几个特点:
容器平台是一个动态的平台。和传统部署不一样地方在于服务运行的位置、数量和时间等都是动态变化的。
应用混搭在同一集群。在使用容器编排工具进行资源调度时,一台宿主机上运行的服务类型是多种多样的,采集日志时要很好的区分日志所属的服务。
容器化的服务是无状态的。目前容器平台的大多数服务多是无状态的,容器销毁后存储会随之销毁。
本文提供了一种基于 filebeat,支持 Docker 容器日志采集的解决方案。
为什么选择 filebeat
filebeat 是一个轻量级的日志传输工具,会监控日志目录或这指定的日志文件,追踪文件的变化,并且转发文件到 logstarsh、kafka 或者直接到 elastisearch。选用 filebeat 来采集日志主要原因是 filebeat 在 5.3 版本以后支持动态载入外部配置,在容器的动态环境下,我们仅需根据调度的服务生成指定的配置即可。
另外其具有以下优点:
filebeat 是elastic.co公司开发的,官方对 filebeat 提供了最全面的支持。接入目前普遍应用的分析和检索系统 elastisearch 更为简单。
filebeat 的性能非常好。相比于 logstash 是基于 JVM 的,资源额外开销十分巨大,filebeat 是基于 Golang 开发的,相当于资源消耗更小,更便捷的 logstash。并且部署简单,是一个非常理想的日志采集工具。
filebeat 是基于elastic.co官方提供的 libbeat 库开发的,代码量不大,方便对其进行改造与优化。
filebeat 安装
filebeat 作为一个轻量级日志收集工具,安装和配置十分简单:
从官网下载对应的安装包https://www.elastic.co/downloads/beats/filebeat
解压并修改配置文件
运行./filebeat -e -c filebeat.yml
filebeat 配置说明及优化
filebeat.registry_file:
registry 文件路径,用于记录日志文件信息。
filebeat.spool_size:
后台事件计数阈值,超过后强制发送。
filebeat.idle_timeout:
后台刷新超时时间,超过定义时间后强制发送,不管spool_size是否达到。
filebeat 支持动态环境
在容器平台动态环境下,我们仅需根据调度到宿主机上的任务生成指定配置到 config/*.yml 中即可。对于动态生成 filebeat 配置,我们需要实现一个支持监控容器变化,生成 prospectors 配置的工具 filebeat-reload。此工具需要具有以下几个特性解决动态环境下日志采集的问题:
监控日志目录变化
由于容器平台动态性,我们无法提前声明需要采集日志的路径及属性,需要感知和发现到服务日志,来进行动态配置。
服务日志自动打标
需要对服务日志打上标记,标明日志所属服务以及来源等信息。
管理文件句柄
filebeat 在采集日志过程中,会保持文件句柄的打开状态。在容器平台动态环境下,容器销毁后要及时释放文件句柄。
生成的配置文件基础配置如下:
paths:日志文件路径,可用通配符,注意不支持递归。
exclude_lines: 排除行,后接一个正则表达式的列表。
tail_files: 配置为true时,filebeat将从新文件的最后位置开始读取。
fields:添加附加字段,可以使 values,arrays,dictionaries 或者任何嵌套数据。用于区分在同一宿主机上的不同服务的不同日志。
service_tag: 日志打服务 tag 标记,区分所属服务。
container: 日志所属容器。
log_name: 日志名。
filebeat output 配置
filebeat 可将日志数据打入 Elasticsearch、Logstash、Kafka、Redis、File、Console。Elasticsearch 是目前常用的日志存储及检索服务,filebeat 可将日志数据直接打入 Elasticsearch。但当集群规模变大,filebeat 客户端数量增多,会导致 elasticsearch 的接收队列满,日志堆积的问题。
kafka 是一种高吞吐量的分布式发布订阅消息系统,filebeat 将数据打入 kafka,有 kafka 做缓冲,再消费至 Elasticsearch 集群,可以有效的缓解 Elasticsearch 集群压力。
output 配置:
hosts:kafka 地址列表。
topic:生产 kafka 数据的 topic。
max_message_bytes:发送数据的最大字节数。
总结
容器平台动态环境下日志的采集主要需要解决服务的动态性带来的采集目标不固定、日志标记不明确的问题。本文基于 filebeat,增加一个简单的配置工具,使其能够监控容器日志变化,动态生成相应配置并标记日志来源,从而解决容器日志采集的问题。
整体结构如下图所示:
领取专属 10元无门槛券
私享最新 技术干货