How to pass docker host to fluentd logs

Viewed 1867

I use fluentd log driver to collect logs in my docker swarm cluster.

I have created fluentd service:

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;

Then I have created service with fluentd log driver:

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;

My fluent.conf is

<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>

Log text has following format:

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

How can I add server host name on witch container is running to fluentd log message?

I have tried this approach:

1) create new fluentd image with docker_metadata_filter installed. I have used following 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) Run fluentd service with new image.

But I still have logs with in format

{"container_id":"...",
 "container_name":"...",
 "source":"stdout",
 "log":"..."}
0 Answers
Related