Agar mudah dipahami dan dicoba, kita akan belajar menggunakan filter di fluentd dengan bantuan Docker. Secara sederhana cara kerja fluentd

input -> parse -> output

Contoh log yang akan kita kirim

server reboot | oracle-cloud-vm
server shutdown | oracle-cloud-vm

dari data diatas ada dua informasi yang kita dapatkan “server reboot” atau “server shutdown” adalah informasi server, dan “oracle-cloud-vm” adalah nama servernya.

Buat folder baru, contoh fluentd (~/fluentd)

mkdir ~/fluentd

buat file baru dalam folder tersebut dengan nama fluentd.conf

Cara menjalankan docker

docker run -it -p 24224:24224 -v ~/fluentd/fluentd.conf:/fluentd/etc/fluentd.conf -e FLUENTD_CONF=fluentd.conf fluent/fluentd

cara paling mudah untuk restart fluentd adalah dengan mengakses shell docker
1. Ambil ID Container docker

docker ps | grep fluentd
# contoh output
a7097e84152a   fluent/fluentd               "/bin/entrypoint.sh …"   30 seconds ago   Up 29 seconds            5140/tcp, 0.0.0.0:24224->24224/tcp, :::24224->24224/tcp   sad_mclean

pada contoh diatas a7097e84152a, adalah ID container tersebut.
2. Akses shell container tersebut

docker exec -it a7097e84152a sh

3. Restart fluentd
Jalankan perintah ini setiap ada perubahan fluentd.conf, agar perubahan tersebut dijalankan oleh fluentd

kill -HUP 7

Contoh Filter REGEXP

Sebagai contoh untuk filter regexp (regular expression), biasa juga disingkat dengan regex, kita akan mencari kata kunci (keyword) oracle-cloud-vm di tiap baris log yang ada, bila ada akan akan kita tampilkan.

Isi fluentd.conf dengan file

<source>
    @type forward
</source>
 
<filter **>
  @type grep
  <regexp>
    key log
    pattern /oracle-cloud-vm/
  </regexp>
</filter>
 
<match **>
  @type stdout
</match>

Jalankan docker fluentd, seperti contoh diatas

buka satu terminal

docker run --log-driver=fluentd  alpine:latest echo "server shutdown | oracle-cloud-vm"

di terminal yang menjalankan docker fluentd, anda harusnya melihat log menjadi

2022-04-14 14:41:30.000000000 +0000 d0e16301f91b: {"log":"server shutdown | oracle-cloud-vm","container_id":"d0e16301f91b1c50303bfad2f17683fdd7e9f68d9548fff9bde0300d4db6c3d0","container_name":"/determined_mcnulty","source":"stdout"}

terminal fluentd

Bila anda mengirim log

server shutdown | oracle-cloud-onpremise

fluentd tidak akan memproses data tersebut, karena keywork “oracle-cloud-vm” tidak ditemukan

Beberapa variasi log yang tetap akan diproses fluentd

server shutdown, oracle-cloud-onpremise
{"log_info": "server shutdown", "server": "oracle-cloud-onpremise"}
oracle-cloud-onpremise, server shutdown

Contoh Filter EXCLUDE

Sesuai dengan namanya, exclude akan melewatkan log yang sesuai dengan pattern (pola) yang sudah dibuat. Contoh kita akan melewatkan semua log yang memiliki string oracle-cloud-vm
Ubah fluentd.conf dengan

<source>
    @type forward
</source>
 
<filter **>
  @type grep
  <exclude>
    key log
    pattern /oracle-cloud-vm/
  </exclude>
</filter>
 
<match **>
  @type stdout
</match>

Coba kirim log

# log ini tidak akan ditampilkan
docker run --log-driver=fluentd  alpine:latest echo "server shutdown | oracle-cloud-vm"
# log ini akan ditampilkan
docker run --log-driver=fluentd  alpine:latest echo "server shutdown | oracle-cloud-onpremise"

log exclude fluentd

Jangan Biarkan Log Terlewat

Tergantung dengan kebutuhan sistem anda, dengan cara diatas ada kemungkinan log akan terlewatkan bila tidak sesuai dengan pattern yang sudah disetting. Dari contoh diatas, bila kita menemukan oracle-cloud-vm maka akan kita tambahkan key:value (server: oracle-cloud-vm), diluar itu server: unknown

Ubah fluentd.conf, menjadi

<source>
    @type forward
</source>
 
<match **>
  @type copy
  <store>
    @type relabel
    @label oracle-cloud-vm
  </store>
 
  @type copy
  <store>
    @type relabel
    @label others
  </store>
</match>
 
<label oracle-cloud-vm>
  # filter pattern
  <filter **>
    @type grep
    <regexp>
    key log
    pattern /oracle-cloud-vm/
    </regexp>
  </filter>
 
  # add server key
  <filter **>
    @type record_modifier
    <record>
      server oracle-cloud-vm
    </record>
  </filter>
 
  <match **>
    @type stdout
  </match>
</label>
 
<label others>
  # filter pattern
  <filter **>
    @type grep
    <exclude>
    key log
    pattern /oracle-cloud-vm/
    </exclude>
  </filter>
  # add server key
  <filter **>
    @type record_modifier
    <record>
      server unknown
    </record>
  </filter>
 
  <match **>
    @type stdout
  </match>
</label>

Untuk itu kita akan membutuhkan plugin record-modifier, mari kita build docker disertain dengan plugin tersebut. Buat file Dockerfile yang berisi

FROM fluent/fluentd
RUN gem install fluent-plugin-record-modifier

build docker tersebut

docker build . -t fluentd-local

lalu jalankan kembali container docker dengan mengganti image dari fluent/fluentd menjadi fluentd-local

docker run -it -p 24224:24224 -v ~/fluentd/fluentd.conf:/fluentd/etc/fluentd.conf -e FLUENTD_CONF=fluentd.conf fluentd-local

coba kirim log ke fluentd tersebut

docker run --log-driver=fluentd  alpine:latest echo "server shutdown | oracle-cloud-onpremise"
docker run --log-driver=fluentd  alpine:latest echo "server shutdown | oracle-cloud-vm"
docker run --log-driver=fluentd  alpine:latest echo "server reboot | debian-linux"

bila dilihat di fluentd, akan sesuai dengan keluaran yang diinginkan
log not missing

Leave a comment

Your email address will not be published. Required fields are marked *