apache2 rotate log 的注意事項

apache2 沒有收到 SIGHUP 就關掉 log 檔重開這回事, 所以若手動改 log 檔, apache2 仍會寫入同一個檔案。Ubuntu 上 logrotate 的作法是, 在 rotate apache2 的 log 檔後, 會要求 apache2 reload config, 藉此讓 apache2 關掉重開 log 檔, 好讀到新的檔名。可從 logrotate 設定 apache2 的內容看出這件事 (/etc/logrotate.d/apache2):
/var/log/apache2/*.log {
        weekly
        missingok
        rotate 52
        compress
        delaycompress
        notifempty
        create 640 root adm
        sharedscripts
        postrotate
                if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then
                        /etc/init.d/apache2 reload > /dev/null
                fi
        endscript
}

但若自己架的一些 Web 服務需要「暖機」的程序的話 (比方說在 CGI process 的記憶體內暫存一些前處理的資料), logrotate 作法會拖慢 log rotation 後第一批連進來的使用者。

apache2 有提供 piped logs 來避免 apache2 reload。概念是透過外部程式來 rotate log, 而 apache2 也會知道發生 log rotation, 藉此重開檔案。官網有提到, 除搭配內建的 rotatelogs 外, cronolog 是更彈性的選擇, 在《Apache log rotate 的另一個選擇:cronolog》有詳細的教學。另外要注意的是, cronolog 不像 logrotate 有提供設權限的機制, 自己要另外跑個 crontab 將群組改為 adm, 權限設成 640。

留言

這個網誌中的熱門文章

(C/C++ ) 如何在 Linux 上使用自行編譯的第三方函式庫

熟悉系統工具好處多多

virtualbox 使用 USB 裝置