linux logrotate 精確時間點執行切割檔案

2023110915:53

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