logrotate daily 並不會準時在 0點0分 的時候執行,
通常都是在半夜 3 點以後
就造成 httpd log 檔案的內容,包含前後兩天的資料,未精確的以 "日" 來切割
主要是因為 /etc/anacrontab 檔案的設定
# /etc/anacrontab: configuration file for anacron SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # the maximal random delay added to the base delay of the jobs RANDOM_DELAY=45 # the jobs will be started during the following hours only START_HOURS_RANGE=3-22 #period in days delay in minutes job-identifier command 1 5 cron.daily nice run-parts /etc/cron.daily 7 25 cron.weekly nice run-parts /etc/cron.weekly @monthly 45 cron.monthly nice run-parts /etc/cron.monthly這檔案說明
/etc/cron.daily 會在 3:05~3:50 之間執行 (3點5分以後,隨機0~45分鐘)
/etc/cron.weekly 會在 3:25~4:10 之間執行 (3點25分以後, 隨機0~45分鐘)
/etc/cron.monthly 會在 3:45~4:30 之間執行 (3點45分以後,隨機0~45分鐘)
若想要精確的在 00:00 這個時間 ,執行logrotate,切割 log 檔案:
建立一個新目錄
mkdir /etc/logrotate.box
把舊的 httpd 設定檔案搬過來
mv /etc/logrotate.daily/httpd /etc/logrotate.box 註: /etc/logrotate.daily/ 目錄不要再保留 httpd 檔, 不然會在 3點後 logrotate 定時執行時,又處理一次 httpd log檔案
修改 /etc/logrotate.box/httpd 檔案
建議加上 dateext, dateformat 兩行這樣 rotate 後的檔案名稱,就會依日期命名
例如 access_log-20211005
不加的話,會變成 access_log.1 / access_log.2 ...流水號處理
/var/log/httpd/*log { missingok notifempty sharedscripts delaycompress rotate 31 daily dateext dateformat -%Y%m%d postrotate /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true endscript }
設定 crontab 即可
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.box/httpd >/dev/null 2>&1