如何将docker host传递给流畅的日志

时间:2017-10-01 22:49:50

标签: docker fluentd

我使用流利的日志驱动程序来收集docker swarm集群中的日志。

我创建了流利的服务:

docker service create --name fluentd --network my-network \
  --mount type=bind,src=/data/fluentd,dst=/fluentd/etc \
  --mount type=bind,src=/data/fluentd/logs,dst=/fluentd/log \
  -p 24224:24224 -p 24224:24224/udp\
  -e FLUENTD_CONF=fluent.conf fluent/fluentd:v0.12;

然后我用流利的日志驱动程序创建了服务:

docker service create --name service-name --network my-network \
  --log-driver=fluentd --log-opt fluentd-address=123.456.789.123:24224 
  --log-opt tag="service-name" \
  --with-registry-auth service-name;

我的fluent.conf

<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>
<match service-name>
  @type copy
   <store>
    path /fluentd/log/service-name.*.log
    @type file
    time_slice_format %Y.%m.%d
    time_slice_wait 1m
    time_format %Y%m%dT%H%M%S%z
    compress gzip
    format json
  </store>
</match>

日志文本格式如下:

{"container_id":"d798ca314b54a27f8b0e9acad46879632c7fdb1796d17c6850665ca93995c717",
"container_name":"/service-name.1.rrcfvwvzrn17pyyt2zi69nhag",
"source":"stdout","log":"2017-10-02 00:35:59 [qtp2091640041-40] DEBUG Log message..."}

如何在女巫容器上添加服务器主机名,以便熟悉日志消息?

我尝试过这种方法:

1)创建安装了docker_metadata_filter的新流畅图像。我使用了以下Dockerfile

FROM fluent/fluentd:v0.12-onbuild

RUN apk add --update --virtual .build-deps \
        sudo build-base ruby-dev \
 && sudo gem install \
        fluent-plugin-docker_metadata_filter \
 && sudo gem sources --clear-all \
 && apk del .build-deps \
 && rm -rf /var/cache/apk/* \
           /home/fluent/.gem/ruby/2.3.0/cache/*.gem

2)使用新图片运行fluentd服务。

但我仍然有格式的日志

{"container_id":"...",
 "container_name":"...",
 "source":"stdout",
 "log":"..."}

1 个答案:

答案 0 :(得分:0)

请纠正我,因为我无法发表评论。我认为这是我们可以实现的方式。当使用给定的命令创建docker服务时,请在标签选项中包含服务器的主机名。

docker service create --name service-name --log-driver=fluentd --log-opt tag="service-name"_${HOSTNAME}

现在,您的匹配项将为服务名称。*

由于<store>部分与<match>部分相似。您可以执行以下操作,而不是format json

<format>
  @type json
  include_tag_key true
  tag_key event_tag
</format>

现在,您的json输出应该具有一个名为event_tag的新字段。

{"container_id":"...",
 "container_name":"...",
 "source":"stdout",
 "log":"...",
"event_tag":"service-name_SERVER01"}

参考- https://docs.fluentd.org/v1.0/articles/out_copy#%3Cstore%3E-section https://docs.fluentd.org/v1.0/articles/formatter_json

让我知道这是否行不通。对于$ {HOSTNAME},我假设您正在使用bash在Linux服务器上运行swarm,并且可以在event_tag字段值的service-name前缀部分使用ok。 :)