Saya ingin mencapai rotasi log nginx yang:
- akan bekerja tanpa perangkat lunak tambahan (mis. - terbaik jika tanpa "logrotate")
- akan membuat file yang diputar dengan nama berdasarkan tanggal
Pendekatan terbaik adalah sesuatu yang dimiliki PostgreSQL - yaitu dalam variabel config log_filename-nya, saya dapat menentukan strftime-style% Y-% m-% d, dan itu akan secara otomatis mengubah log pada tanggal (atau waktu) perubahan.
Pendekatan lain dari apache - mengirimkan log melalui pipa ke program rotatelogs.
Sejauh yang saya bisa cari - tidak ada pendekatan seperti itu. Yang bisa saya lakukan adalah menggunakan logrotate dengan opsi dateext, tetapi ia memiliki sejumlah kekurangannya sendiri, dan saya lebih suka menggunakan sesuatu yang berfungsi seperti | rotatelogs atau log_filename di PostgreSQL.
Jawaban:
Sementara dunia terbagi pada apakah pipa bernama rendah hati itu teman atau musuh, itu mungkin solusi paling sederhana untuk masalah Anda. Memang ada beberapa kekurangan (dalam hal itu Anda perlu membuat pipa sebelumnya), tetapi itu menghilangkan kebutuhan untuk cron dan memungkinkan Anda untuk menggunakan pipa log-filter pilihan Anda.
Berikut ini contoh menggunakan cronolog di
access.log
:/var/log/nginx
, jadi saya akan menaruh pipa saya di sana juga. Nama terserah Anda; Saya menambahkan.fifo
, dan ituaccess.log
, jadi milik saya akan berada di/var/log/nginx/access.log.fifo
.Buat pipa bernama untuk file log:
Konfigurasikan
nginx.conf
untuk mengarahkan log ke pipa yang baru saja Anda buat:Ubah skrip init.d Anda untuk memulai rotator log mendengarkan pipa sebelum kita memulai server:
Baris perintah serupa akan digunakan
rotatelogs
jika Anda menginginkannyacronolog
- lihat dokumen mereka untuk sintaks.Jika distrobution Anda memiliki
start-stop-daemon
, Anda harus menggunakannya sebagai gantinya, karena secara teoritis memiliki pengetahuan khusus apa pun tentang platform Anda, dan merawatpkill
Anda. Hanya membungkus perintah dalam skrip, dan meneruskannya--exec
kestart-stop-daemon
dalaminit.d/nginx
.sumber
Saya telah menulis sebuah program sederhana, datelog, untuk membagi log umum berdasarkan tanggal login, sebagai lawan dari waktu sistem saat ini ketika baris log dilihat oleh program. Ini mungkin atau mungkin bukan apa yang sudah dilakukan kronolog atau pembagi log lain, tetapi lebih cepat menulis sendiri daripada mencari tahu apa yang dilakukan orang lain.
Dengan menggunakan tahun dan bulan dalam permintaan yang dicatat, baris kemudian ditulis ke file atau pipa yang mencakup YYYYMM yang dihitung dari data yang dicatat. Ya ini agak spesifik untuk format log umum. Yang pertama [diasumsikan untuk membatasi tanggal. Waspadai alamat IPv6. :)
Untuk analisis log, penting bahwa setiap log hanya berisi permintaan untuk setiap bulannya, dan setiap log idealnya harus lengkap untuk hasil analisis yang benar. Tidak cukup menentukan nama file berdasarkan waktu saat ini di dalam splitter log, karena permintaan lambat mulai pukul 23:59:59 kemudian akan berakhir di file log untuk bulan yang salah.
Saya menggunakan ini dengan nginx dengan cara bernama fifo yang diperiksa keberadaannya sebelum nginx dimulai. Perhatikan bahwa ada tradeoff dalam program antara deteksi kesalahan dan output buffer, di mana datelog saat ini lebih memilih output buffer untuk alasan kinerja, jadi harap pastikan bahwa setup Anda benar-benar berfungsi, terutama ketika menggunakan pipa shell, agar tidak kehilangan data log .
Kode sumber: http://stuge.se/datelog.c
Jangan ragu untuk mengirim saya umpan balik dan tentu saja tambalan!
sumber
Anda dapat mencapai ini menggunakan skrip bash dan cron sederhana:
Lebih detail tentang pengaturan crontab dll. Ditemukan di sini: Memutar file log Nginx via Cron
sumber
Saya khawatir saya tidak begitu mengerti pertanyaan Anda: Karena nginx tidak mendukung logrotasi bawaan, Anda harus menggunakan sesuatu seperti
di suatu tempat di /etc/cron.daily (tentu saja Anda harus memenuhi syarat nama file di atas dengan nama path lengkap) atau menginstal utilitas apache2 untuk memiliki akses ke rotatelogs.
sumber