fluentd收集docker容器日志

在之前一篇文章“采集docker-container日志”中使用了filebeat进行日志采集,一开始还好好的,但是后面发现这玩意不好用。后来使用了另外的一套工具fluentd来代替filebeat和logtash,这里总结一下两个方案的体验以及如何使用fluentd来采集日志。


fluentd收集docker容器日志

fluentd搭建

本次使用最简单的方式,使用fluentd的docker镜像来搭建,其镜像使用的是fluent/fluentd,当中搭建的方式、配置文件、安装插件(例如fluent-plugin-elasticsearch插件)已经描述得很清楚,不再详细描述。

容器日志采集

logging drivers

docker的有一个logging drivers的概念,其指定了docker容器产生的日志的处理方式,默认的是json-file。logging drivers为json-file时候,可以使用docker logs的命令开查看容器的日志输出,另外日志会输出到/var/lib/docker/containers/*/*.log下。其他的logging drivers请看文档
本次使用到的docker的logging drivers中的fluentd,没错,直接支持日志转发到fluentd中,所以可以只记录我需要的容器日志,不需要再做什么过滤的功能。

dockerfile中的设置

相关的设置,文档也有对应的描述。下面讲述一下详细的过程,部分在文档中没有提到。

1
2
3
4
5
6
7
8
version: '2'
services:
mysql:
logging:
driver: fluentd
options:
fluentd-address: "${FLUENTD_HOST}:24224"
tag: "docker.web"

上面是我一个服务的设置,在文档中都有提及到,其中有一个比较重要的是tag这个参数,这个参数可以自定义,这样就可以在后面的流程中进行一下自定义的过滤,还可以在日志中通过tag标签找到产生日志对应的服务。

fluentd配置

fluentd的功能非常齐全,例如日志过滤,日志记录方式(使用文件记录日志,转发到Elasticsearch)等等。下面是转发到Elasticsearch的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
<label @mainstream>
<match docker.**>
@type elasticsearch
host elasticsearch
port 9200
type_name docker
logstash_format true
logstash_prefix docker-logs
logstash_dateformat %Y-%m-%d
flush_interval 5s
include_tag_key true
</match>
</label>

记录几点:

  • 需要安装fluent-plugin-elasticsearch插件,在上面的“fluentd搭建”中已经提及。
  • match配置,上面配置是当匹配到docker.**的时候会使用此逻辑,因此上面“dockerfile中的设置”的例子中标记的tagdocker.web就会走这里的逻辑,日志转发到Elasticsearch中。
  • 使用了logstash_format之后,建立的Elasticsearch索引都是{logstash_prefix}_{logstash_dateformat}的,例如上面的例子,建立的索引就是docker-logs-2018-01-01

与filebeat+logstash方案的对比

  • 优点:

    • logging drivers支持fluentd,在构建时候指定logging drivers就可以,无需其他复杂操作。
    • 因此可以单独设置指定的容器,而filebeat则需要采集容器的文件日志,并且编写过滤规则(额,吐槽一下,规则复杂的时候filebeat的配置不好编写)。
    • 功能完善,相当于filebeat和logstash的结合版本(由于对它们的了解不算太深入,所以说的比较泛)。
  • 缺点:

    • 如果fluentd出了问题的时候,容器启动失败。