本篇文章介绍了一种基于 filebeat,支持 Docker 容器日志采集的解决方案。分别说明了filebeat优势、特性及相关配置。
随着容器技术的发展,越来越多的传统应用将会逐渐容器化。日志作为应用的一个关键环节,尤其是在使用容器编排工具进行容器调度的动态环境下,程序的排错和健康状态的分析很多都依赖日志信息的收集。在容器平台这种动态的环境下,如何在应用的容器化过程中,方便快捷的自动发现和采集日志是将传统应用容器化部署的一个重要方面。
相比于传统日志的采集,容器日志采集主要存在以下几个特点:
-
容器平台是一个动态的平台。
和传统部署不一样地方在于服务运行的位置、数量和时间等都是动态变化的。
-
应用混搭在同一集群。
在使用容器编排工具进行资源调度时,一台宿主机上运行的服务类型是多种多样的,采集日志时要很好的区分日志所属的服务。
-
容器化的服务是无状态的。
目前容器平台的大多数服务多是无状态的,容器销毁后存储会随之销毁。
本文提供了一种基于 filebeat,支持 Docker 容器日志采集的解决方案。
filebeat 是一个轻量级的日志传输工具,会监控日志目录或这指定的日志文件,追踪文件的变化,并且转发文件到 logstarsh、kafka 或者直接到 elastisearch。选用 filebeat 来采集日志主要原因是 filebeat 在 5.3 版本以后支持动态载入外部配置,在容器的动态环境下,我们仅需根据调度的服务生成指定的配置即可。
另外其具有以下优点:
-
filebeat 是
elastic.co
公司开发的,官方对 filebeat 提供了最全面的支持。接入目前普遍应用的分析和检索系统 elastisearch 更为简单。
-
filebeat 的性能非常好。相比于 logstash 是基于 JVM 的,资源额外开销十分巨大,filebeat 是基于 Golang 开发的,相当于资源消耗更小,更便捷的 logstash。并且部署简单,是一个非常理想的日志采集工具。
-
filebeat 是基于
elastic.co
官方提供的 libbeat 库开发的,代码量不大,方便对其进行改造与优化。
filebeat 作为一个轻量级日志收集工具,安装和配置十分简单:
-
从官网下载对应的安装包
https://www.elastic.co/downloads/beats/filebeat
-
解压并修改配置文件
-
运行./filebeat -e -c filebeat.yml
filebeat.yml
filebeat.registry_file:/patrh/to/registry
filebeat.spool_size:2048
filebeat.idle_timeout:5s
filebeat.config.prospectors:
enabled: true
path: configs/*.yml
reload.enabled: true
reload.period: 10s
filebeat.registry_file:
registry 文件路径,用于记录日志文件信息。
filebeat.spool_size
:
后台事件计数阈值,超过后强制发送。
filebeat.idle_timeout
:
后台刷新超时时间,超过定义时间后强制发送,不管spool_size是否达到。
filebeat.config.prospectors
:
path:外部配置所在目录,在容器平台动态环境下动态配置所在目录。
reload.enabled:此值设为 true 时,启用动态载入配置功能。
reload.period:检查配置文件周期。建议此配置大于 1s。
在容器平台动态环境下,我们仅需根据调度到宿主机上的任务生成指定配置到 config/*.yml 中即可。对于动态生成 filebeat 配置,我们需要实现一个支持监控容器变化,生成 prospectors 配置的工具 filebeat-reload。此工具需要具有以下几个特性解决动态环境下日志采集的问题:
监控日志目录变化
由于容器平台动态性,我们无法提前声明需要采集日志的路径及属性,需要感知和发现到服务日志,来进行动态配置。
服务日志自动打标
需要对服务日志打上标记,标明日志所属服务以及来源等信息。
管理文件句柄
filebeat 在采集日志过程中,会保持文件句柄的打开状态。在容器平台动态环境下,容器销毁后要及时释放文件句柄。
生成的配置文件基础配置如下:
-paths:
-“path/to/log”
exclude_files: [".gz",".Z",".bz2",".tar",".rar",".zip"]
document_type: log
tail_files:true
fields:
service_tag: "service-name"
container: "service-name.container"
log_name: "service-name.log"
paths
:日志文件路径,可用通配符,注意不支持递归。
exclude_lines
: 排除行,后接一个正则表达式的列表。
tail_files
: 配置为true时,filebeat将从新文件的最后位置开始读取。
fields
:添加附加字段,可以使 values,arrays,dictionaries 或者任何嵌套数据。用于区分在同一宿主机上的不同服务的不同日志。
service_tag
: 日志打服务 tag 标记,区分所属服务。
container
: 日志所属容器。
log_name
: 日志名。