Belajar Nginx - Customized Logging, JSON Logging & Log Rotation
Episode 15 of 21

Belajar Nginx - Customized Logging, JSON Logging & Log Rotation

Episode ini menjelaskan log_format kustom, access log berformat JSON untuk integrasi SIEM, logging kondisional dengan map, serta rotasi file log memakai logrotate.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Log NGINX adalah mata kalian terhadap traffic yang lewat. Namun log default yang mentah sulit dianalisis dan mahal untuk disimpan. Episode 15 ini membahas customized logging, JSON logging, dan log rotation — cara mengubah log menjadi aset observability yang terstruktur.

Kalian akan mendefinisikan format log sendiri, menghasilkan access log JSON yang siap dikirim ke ELK Stack, Grafana Loki, atau Fluent Bit, mengabaikan request yang tidak penting secara kondisional, dan mengelola rotasi file log dengan logrotate.

Kustomisasi Log Format

Variabel Penting di Access Log

Format default NGINX menyimpan $remote_addr, $request, dan $status. Tapi masih banyak variabel berguna yang tersedia:

  • $remote_addr — IP klien.
  • $request — baris request lengkap.
  • $status — status code.
  • $body_bytes_sent — ukuran respons.
  • $http_referer — halaman asal.
  • $http_user_agent — user agent klien.
  • $request_time — durasi pemrosesan request.
  • $upstream_response_time — waktu respons backend.

Membuat log_format Kustom

Deklarasikan format di context http:

Membuat log_format kustom
http {
    log_format combined_ext '$remote_addr - $remote_user [$time_local] '
                            '"$request" $status $body_bytes_sent '
                            '"$http_referer" "$http_user_agent" '
                            'rt=$request_time';
 
    access_log /var/log/nginx/access.log combined_ext;
}

log_format combined_ext mendefinisikan format baru dengan nama combined_ext. Directive access_log lalu memakainya. Setiap field dipisahkan spasi, dan variabel yang mengandung spasi dibungkus tanda kutip.

JSON Formatting Access Logs

Log JSON untuk SIEM dan Log Analytics

Pipeline observability modern hampir selalu memakai JSON karena mudah di-parse. Format JSON di NGINX dideklarasikan dengan pola yang sama:

Access log berformat JSON
http {
    log_format json_combined escape=json
        '{'
            '"time_local":"$time_local",'
            '"remote_addr":"$remote_addr",'
            '"remote_user":"$remote_user",'
            '"request":"$request",'
            '"status":$status,'
            '"body_bytes_sent":$body_bytes_sent,'
            '"request_time":$request_time,'
            '"upstream_response_time":"$upstream_response_time",'
            '"http_user_agent":"$http_user_agent",'
            '"http_referer":"$http_referer"'
        '}';
 
    access_log /var/log/nginx/access.log json_combined;
}

escape=json membuat nilai dengan karakter khusus di-escape dengan benar. Setelah reload, setiap baris access log adalah objek JSON valid yang langsung bisa dikonsumsi Fluent Bit, Filebeat, atau promtail.

Periksa hasilnya:

Lihat log JSON
sudo tail -1 /var/log/nginx/access.log

tail -1 /var/log/nginx/access.log menampilkan baris terakhir — seharusnya berupa objek JSON dengan semua field di atas.

Conditional Logging

Mengabaikan Request Statis dan Health Check

Request ke static asset dan health check memenuhi log dengan data tidak berguna. Matikan logging kondisional dengan map:

Logging kondisional dengan map
http {
    map $request_uri $loggable {
        default 1;
        ~\.(js|css|png|jpg|gif|ico|woff2)$ 0;
        ~^/healthz 0;
        ~^/metrics 0;
    }
 
    access_log /var/log/nginx/access.log combined_ext if=$loggable;
}

map mengisi variabel $loggable: bernilai 0 untuk URI static dan health check, 1 untuk sisanya. Sintaks access_log ... if=$loggable; hanya menulis log ketika nilai variabelnya truthy. Hasilnya: disk log berkurang drastis dan analisis menjadi lebih fokus.

Log Rotation

Pengelolaan dengan logrotate

Tanpa rotasi, file log membesar tanpa henti sampai menghabiskan disk. Distro menyediakan logrotate dengan konfigurasi default untuk NGINX:

Konfigurasi logrotate default
ls /etc/logrotate.d/
sudo cat /etc/logrotate.d/nginx

Konfigurasi default biasanya memutar log setiap minggu, menyimpan beberapa versi, dan memanggil nginx -s reopen setelah rotasi agar NGINX membuka file log baru.

Menguji Rotasi Manual

Jalankan rotasi secara manual untuk memastikan konfigurasi bekerja:

Tes logrotate
sudo logrotate -d /etc/logrotate.d/nginx

logrotate -d menjalankan mode debug: menampilkan apa yang akan dilakukan tanpa benar-benar memutar log. Jika output bersih, rotasi otomatis lewat cron mingguan akan berjalan dengan aman.

Penutup

Episode 15 mengubah log menjadi aset observability: kalian bisa mendefinisikan format kustom, menghasilkan access log JSON untuk SIEM, mematikan logging untuk request tidak penting, dan merotasi log secara teratur dengan logrotate.

Inti yang harus dibawa pulang:

  • log_format mendefinisikan format log kustom dengan variabel NGINX.
  • Format JSON dengan escape=json siap dipakai pipeline ELK, Loki, atau Fluent Bit.
  • map dan if=$loggable mengabaikan log static asset dan health check.
  • Log rotasi mencegah disk penuh; default distro berjalan mingguan.
  • logrotate -d menguji konfigurasi tanpa efek samping.
  • nginx -s reopen wajib dipanggil setelah rotasi log.

Di episode 16 selanjutnya kita akan membahas performance tuning dan OS kernel optimization — optimasi worker processes, pengiriman file dengan sendfile, kompresi gzip dan brotli, open file cache, serta tuning parameter kernel Linux.

Belajar Nginx - Customized Logging, JSON Logging & Log Rotation | Belajar Nginx