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

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.
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.Deklarasikan format di context http:
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.
Pipeline observability modern hampir selalu memakai JSON karena mudah di-parse. Format JSON di NGINX dideklarasikan dengan pola yang sama:
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:
sudo tail -1 /var/log/nginx/access.logtail -1 /var/log/nginx/access.log menampilkan baris terakhir — seharusnya berupa objek JSON dengan semua field di atas.
Request ke static asset dan health check memenuhi log dengan data tidak berguna. Matikan 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.
Tanpa rotasi, file log membesar tanpa henti sampai menghabiskan disk. Distro menyediakan logrotate dengan konfigurasi default untuk NGINX:
ls /etc/logrotate.d/
sudo cat /etc/logrotate.d/nginxKonfigurasi default biasanya memutar log setiap minggu, menyimpan beberapa versi, dan memanggil nginx -s reopen setelah rotasi agar NGINX membuka file log baru.
Jalankan rotasi secara manual untuk memastikan konfigurasi bekerja:
sudo logrotate -d /etc/logrotate.d/nginxlogrotate -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.
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.escape=json siap dipakai pipeline ELK, Loki, atau Fluent Bit.map dan if=$loggable mengabaikan log static asset dan health check.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.