Fluentd banyak digunakan dimana-mana sebagai tukang kirim log dan tukang proses/format log. Untuk testing berbagai versi Fluentd, menggunakan docker akan sangat membantu, karena tidak perlu menginstall berbagai dependency Ruby, dan bisa cepat melakukan testing.
Tergantung kebutuhan anda, kita bisa build docker image yang akan digunakan untuk kebutuhan spesifik, sebagai contoh dalam images docker tersebut diperlukan plugin Elasticsearch, Grafana dan lain sebagainya. Disini saya akan build Fluentd dengan plugin ElasticSearch, Sumologic dan Datadog, karena lagi melakukan testing ketiga service tersebut.
Untuk project ini kita akan buat folder baru ~/fluentd
mkdir ~/fluentd
semua file yang akan dibuat diletakkan didalam folder ini.
Buat file Dockerfile
FROM fluent/fluentd RUN gem install fluent-plugin-elasticsearch RUN gem install fluent-plugin-sumologic_output RUN gem install fluent-plugin-datadog
contoh kita akan build dengan tag fluentd-jaranguda
docker build . -t fluentd-jaranguda
untuk memastikan semuanya sudah berjalan dengan lancar, kita perlu membuat config sederhana fluentd.conf
<source> @type forward </source> <match **> @type stdout </match>
lalu jalankan fluentd
docker run -it -p 24224:24224 -v ~/fluentd/fluentd.conf:/fluentd/etc/fluentd.conf -e FLUENTD_CONF=fluentd.conf fluentd-jaranguda:latest
kita menggunakan port 24224, karena port tersebut adalah port default untuk logging docker.
buka terminal satu lagi, lalu jalankan
docker run --log-driver=fluentd -v ~/fluentd:/tmp -it alpine:latest echo "testing log"
di terminal anda mejalankan fluentd, harusnya muncul output kurang lebih
2021-12-04 08:24:38.000000000 +0000 335f2a001f26: {"log":"testing log\r","container_id":"335f2a001f26f26d4d86434cd64eadc5b42784bac7236cab9906138e8b2782ad","container_name":"/dazzling_haslett","source":"stdout"}
untuk mengirim log tersebut ke elasticsearch, tinggal ubah confignya
<source> @type forward </source> <match **> @type elasticsearch host 172.17.0.1 #ganti dengan IP/Host scheme http port 9200 index_name docker-log include_timestamp true </match>
lalu jalankan ulang container fluentd
Untuk mengirim ke 2 Log Collector sekaligus, gunakan contoh config ini
<source> @type forward </source> <match **> @type copy <store> @type relabel @label @sumologic </store> <store> @type relabel @label @elasticsearch </store> </match> <label @elasticsearch> <match **> @type elasticsearch host 172.17.0.1 scheme http port 9200 index_name ns-data-sumo include_timestamp true </match> </label> <label @sumologic> <match **> @type sumologic endpoint https://collectors.sumologic.com/receiver/v1/http/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX log_format json source_category docker/testing source_name sgp open_timeout 10 </match> </label>
dengan menggunakan docker ini, proses troubleshooting menjadi jauh lebih mudah karena kita bisa mereplica yang terjadi di server lain. Simpan contoh log dibawah ini di file log.log
{"time": "2021-12-04T14:52:13.136+0000", "level": "info", "msg": "something goes wrong, server timeout", "server": "match011", "status": "degraded"} {"time": "2021-12-04T14:52:13.137+0000", "level": "info", "msg": "something goes wrong, server timeout", "server": "match012", "status": "degraded"} {"time": "2021-12-04T14:52:13.138+0000", "level": "info", "msg": "something goes wrong, server timeout", "server": "match013", "status": "degraded"} {"time": "2021-12-04T14:52:13.139+0000", "level": "info", "msg": "something goes wrong, server timeout", "server": "match014", "status": "degraded"} {"time": "2021-12-04T14:52:13.139+0000", "level": "info", "msg": "something goes wrong, server timeout", "server": "match015", "status": "degraded"} {"time": "2021-12-04T14:52:13.139+0000", "level": "info", "msg": "something goes wrong, server timeout", "server": "sumo015", "status": "degraded"} {"time": "2021-12-04T14:52:13.140+0000", "level": "info", "msg": "something goes wrong, server timeout", "server": "sumo015", "status": "degraded"}
lalu kirim ke fluentd
docker run --log-driver=fluentd -v ~/fluentd:/tmp -it alpine:latest cat /tmp/log.log