fluentd是常用容器日志收集工具,与filebeat不同,fluentd可以将容器日志在不落到本地以文件形式存在的情况下,将日志收集并吐到对应的存储中。
例如,通常情况下,容器app的日志需要通过挂在,把容器日志目录挂在到本地,然后日志输出到log文件,以此来持久化。在通过filebeat等日志收集共工具将持久化的log文件吐到相应的日志存储(es或者kafka)中。
通过fluentd,容器不必将日志持久化到本地,fluentd可以直接收集docker logs <container_id>打印的日志,并吐到相应的日志存储中。这样可以节省磁盘空间。
要实现这样的功能需要如下配置:
1.配置docker日志driver为fluentd
在启动容器时,添加参数–log-drive=fluentd。
例如: docker run --log-driver fluentd nginx:latest
这样将使容器以fluentd作为日志driver。
2.配置fluentd
fluentd有许多插件,输出到es需要安装fluent-plugin-elasticsearch插件,安装过程可以查看fluentd官方文档。
<match **>
@type elasticsearch
host localhost
port 9200
logstash_format true
</match>
host:es服务器地址
port:es服务端口
此为一个简单fluentd配置文件。fluentd配置有许多功能,例如新增label或者替换label,以及根据label进行过滤。
当我们配置完成后,通过kibana查看日志,会看到类似下面这样的日志:
- 配置Kibana index pattern
es以index来分别存储收集到的日志,fluentd默认吐到es中的日志的index为logstash,因此在kibana中,创建logstash-*
的index patter,这样kibana将展示所有以“logstash-”头的日志。
- 查询日志
配置好后,可以在kibana中查询到类似如下日志。
可以看出,上面一条日志除了container_name能够勉强识别出该条日志来自于thrall这个app应用,其余信息都不能够明显显示出该条日志来自哪个应用。另外,由于所有app日志默认index为logstash,当我们需要查看某项app是否有错误日志时,查询将变得异常麻烦。
为了解决以上痛点,我们接下来对fluentd进行一些优化配置。
3.优化配置fluentd
在开始运行docker容器时,我们添加了参数--log-driver fluentd
来指定容器日志输出到fluentd进行转发,但收集到的日志没有明显能够说明该条日志来自于哪个app的标签。这样的需求可以通过在启动容器时添加--log-opt tag=thrall
参数使得该容器输出的日志都带上tag=thrall
的标签。这样我们就可以知道该条日志来源于哪个app。
<match *thrall*>
@type elasticsearch
host localhost
port 9200
include_tag_key true
tag_key log_name
logstash_format true
logstash_prefix thrall
</match>
<match *thrall*>:匹配tag中包含thrall的日志。
include_tag_key:会输出所有tag到每一条日志记录中。
tag_key log_name:重命名--log-opt tag=thrall中tag在日志中显示的名称。
logstash_prefix thrall:该参数会使日志的index为thrall-*,在kibana创建index pattern时,就可以通过thrall-*找到所有thrall应用的日志。
完成以上配置,我们来看看日志在kibana中的显示。
- 首先配置index pattern
在create index pattern界面中输入logstash_prefix thrall
配置的thrall-*
如果有日志,create按钮会可点击状态,这样,thrall的所有日志可以在该index pattern下找到。 - 查看日志内容
创建好index pattern之后,可以在查看日志中把thrall-*的index过滤出来。
上面为一条优化后的日志。
log_name为tag_key log_name
配置的log_name。_index
为logstash_prefix
+ 日志收集日期。
这样一来一条日志就可以明确知道该条之日来自哪个应用,并且通过index pattern,可以将同一应用日志通过相通的Index集中到一起查看。