Bagaimana cara menghindari apache memuat ulang saat memutar log?

25

Saya menggunakan logrotate untuk memutar akses Apache, kesalahan dan penulisan ulang log. File konfigurasi saya terlihat seperti ini:

/apache/*log {
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
    lastaction
     /bin/apache reload
    endscript
}

Masalah saya adalah bahwa setiap kali rotasi terjadi, Apache harus dimuat ulang karena Apache tidak menulis lagi di logfile yang baru saja diputar. Apakah ada cara untuk menghindari reload Apache setiap kali logrotate melakukan rotasi?

harpa
sumber

Jawaban:

42

Alasan mengapa apache memerlukan pemuatan ulang adalah bahwa begitu ia membuka sebuah file, ia mendapat filehandle untuk itu, dan itu akan terus menulis ke filehandle itu. Ketika Anda memindahkan file, itu tidak melihat itu, itu hanya terus menulis ke pegangan yang sama. Ketika Anda melakukan ulang, itu akan membuka file lagi dan mendapatkan pegangan baru.

Untuk menghindari memuat ulang, alih-alih memindahkan file, Anda dapat menyalinnya dan mengosongkan file lama. Dengan cara itu apache dapat terus menulis ke filehandle yang sama. Anda melakukan ini dengan menambahkan opsi "copytruncate" ke file konfigurasi logrotate, seperti ini:

/apache/*log {
    copytruncate
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
}
Jenny D
sumber
Terima kasih atas jawaban anda. Jadi saya kira ketika saya menambahkan lastaction echo "" | /apache/*log endscriptfilehandle tidak "hilang"?
Harpa
3
Maaf, saya seharusnya mengatakan "copytruncate" alih-alih "copy". Maka Anda tidak perlu hal terakhir sama sekali. Saya menyalahkan memiliki terlalu banyak darah dalam aliran kafein saya :-)
Jenny D
Bekerja seperti pesona :)
harp
4
@harp hati-hati, logrotatedoc mengatakan: "Perhatikan bahwa ada sedikit waktu antara menyalin file dan memotongnya, sehingga beberapa data logging mungkin hilang."
Totor
Selain kemungkinan beberapa data hilang, apakah ada kelemahan lain yang diketahui untuk digunakan copytruncate?
Leo Galleguillos
5

Saya merekomendasikan Anda untuk menggunakan http://cronolog.org/

Ini adalah bagaimana saya menggunakannya:

CustomLog     "|/usr/local/sbin/cronolog -S /var/log/httpd/t3.CCC.eu-access_log -P /var/log/httpd/t3.CCC.eu-access_log.prev /var/log/httpd/t3.CCC.eu-%Y.log" combined
Boris Ivanov
sumber
1
Perpipaan ke program eksternal apa pun bisa menjadi masalah jika ada banyak lalu lintas ke server web. Tapi itu rapi menghindari masalah filehandle.
Jenny D
Sepertinya alternatif yang bagus. Apakah cronolog mengompres saat itu juga?
Harpa
Ada aplikasi serupa "rotatelogs" dalam paket apache2-utils. Hanya hati-hati untuk tidak "pipa" ke file log yang sama dari berbagai server virtual apache - mereka akan menginjak satu sama lain.
Arie Skliarouk