Rotasi Log

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.
  • logrotate menangani ini otomatis via postrotate script — konfigurasi defaultnya biasanya sudah benar.
  • Selalu gunakan delaycompress bersama compress — memberi jeda bagi Nginx untuk menutup file descriptor lama sebelum dikompres.
  • Gunakan logrotate --force untuk 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 →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact