Rotasi Log #
File log Nginx tumbuh terus seiring waktu. Tanpa rotasi, dalam beberapa bulan file access log bisa mencapai puluhan gigabyte — menghabiskan disk dan memperlambat tools yang membacanya. Rotasi log adalah proses memindahkan file log lama, mengkompresnya, dan membuat file baru secara berkala.
Bagaimana Rotasi Bekerja dengan Nginx #
Ada satu hal khusus tentang Nginx yang perlu dipahami: Nginx menyimpan file descriptor terbuka ke file log. Artinya, jika kamu hanya me-rename atau menghapus file log, Nginx tetap menulis ke file yang sama (via file descriptor yang masih terbuka) — bukan ke file baru.
Untuk memberitahu Nginx agar membuka file log baru setelah rotasi, kirim signal USR1:
# Setelah file log di-rename:
sudo nginx -s reopen
# atau
sudo kill -USR1 $(cat /var/run/nginx.pid)
Setelah menerima USR1, Nginx menutup file descriptor lama dan membuka file log baru (dengan nama yang sama seperti yang dikonfigurasi). Tools rotasi seperti logrotate sudah tahu ini dan menanganinya otomatis.
Konfigurasi logrotate #
logrotate adalah tool standar di Linux untuk mengelola rotasi log. Nginx biasanya sudah menyertakan konfigurasi logrotate saat instalasi di /etc/logrotate.d/nginx:
cat /etc/logrotate.d/nginx
Isinya biasanya seperti ini:
/var/log/nginx/*.log {
daily # Rotasi setiap hari
missingok # Jangan error jika file tidak ada
rotate 14 # Simpan 14 file log lama
compress # Kompres file lama dengan gzip
delaycompress # Kompres setelah rotasi berikutnya (bukan langsung)
notifempty # Jangan rotasi jika file kosong
sharedscripts # Jalankan postrotate script sekali untuk semua file
postrotate
# Kirim signal USR1 ke Nginx untuk membuka file log baru
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
Kustomisasi Konfigurasi logrotate #
Sesuaikan dengan kebutuhan server kamu:
/var/log/nginx/*.log {
weekly # Rotasi mingguan (bukan harian) untuk traffic rendah
rotate 8 # Simpan 8 minggu terakhir
compress
delaycompress
missingok
notifempty
create 0640 www-data adm # Permission file log baru
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
# Konfigurasi berbeda untuk log aplikasi spesifik
/var/log/nginx/api.example.com-*.log {
daily
rotate 30 # Simpan lebih lama untuk API
compress
delaycompress
missingok
notifempty
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
Mengapa delaycompress Penting #
compress mengkompres file log lama dengan gzip. delaycompress menunda kompresi satu siklus — file yang baru dirotasi tidak langsung dikompres:
Tanpa delaycompress:
Hari 1: access.log (aktif) → rotasi → access.log.1.gz (langsung dikompres)
Masalah: jika Nginx masih menulis ke file descriptor lama setelah rotasi,
data tersebut bisa hilang atau corrupt
Dengan delaycompress:
Hari 1: access.log → rotasi → access.log.1 (belum dikompres)
Hari 2: access.log.1 → access.log.2.gz (baru dikompres sekarang)
Jeda ini memberi waktu Nginx menutup file descriptor lama dengan benar
Selalu gunakan delaycompress bersama compress untuk Nginx.
Test dan Eksekusi Manual #
# Test konfigurasi logrotate tanpa menjalankannya
sudo logrotate --debug /etc/logrotate.d/nginx
# Paksa rotasi meski belum waktunya (untuk test)
sudo logrotate --force /etc/logrotate.d/nginx
# Lihat status rotasi terakhir
sudo cat /var/lib/logrotate/status | grep nginx
# Rotasi manual tanpa logrotate
sudo mv /var/log/nginx/access.log /var/log/nginx/access.log.$(date +%Y%m%d)
sudo nginx -s reopen # Nginx buka file access.log baru yang kosong
sudo gzip /var/log/nginx/access.log.$(date +%Y%m%d)
Monitoring Ukuran Log #
# Lihat ukuran semua file log Nginx
sudo du -sh /var/log/nginx/*
# Berapa disk yang digunakan untuk log Nginx secara total
sudo du -sh /var/log/nginx/
# Cek apakah rotasi berjalan dengan benar (file log tidak terus membesar)
watch -n 5 'ls -lh /var/log/nginx/'
# Alert jika file log lebih besar dari 1GB (untuk cron job monitoring)
find /var/log/nginx -name "*.log" -size +1G -exec echo "LOG BESAR: {}" \;
Ringkasan #
- Nginx menyimpan file descriptor terbuka — setelah rotasi, kirim
nginx -s reopen(atau signal USR1) agar Nginx buka file log baru.logrotatemenangani ini otomatis viapostrotatescript — konfigurasi defaultnya biasanya sudah benar.- Selalu gunakan
delaycompressbersamacompress— memberi jeda bagi Nginx untuk menutup file descriptor lama sebelum dikompres.- Gunakan
logrotate --forceuntuk test rotasi manual tanpa menunggu jadwal.- Sesuaikan
rotate(jumlah file yang disimpan) berdasarkan kebutuhan compliance atau debugging — API log mungkin perlu disimpan lebih lama dari log umum.
← Sebelumnya: Format Log Kustom Berikutnya: Worker Process →