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":"..."}