logrotate自定義切割時間的一些坑


轉:https://www.echoxu.cn/logrotate/#logrotate介紹

說起日志切割,很多人會選擇用crontab腳本定時執行已編寫好的日志分割腳本,殊不知在linux上內置了日志分割工具,它就是logrotate且其在centos7上默認安裝了.

logrotate介紹

logrotate是基於crond服務來運行的,其crond服務的腳本是/etc/cron.daily/logrotate,日志轉儲是系統自動完成的。實際運行時,logrotate會調用主配置文件 /etc/logrotate.conf,可以在 /etc/logrotate.d 目錄里放置自定義好的配置文件,用來覆蓋logrotate的缺省值。定時執行/etc/cron.daily目錄下的文件的設置,則在/etc/anacrontab里定義的,那anacrontab怎么知道上次成功執行腳本的具體時間呢?通過查看/etc/cron.daily/logrotate得知有 /var/lib/logrotate/logrotate.status這樣的一個文件,此文件的作用就是記錄最近一次成功運行日志分割腳本的具體時間.

所以logrotate執行腳本的命令其實是/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf

logrotate執行流程

crond服務加載/etc/cron.d/0hourly ---> 在每小時的01分執行/etc/cron.hourly/0anacron ---> 執行anacron ---> 根據/etc/cron.daily/logrotate獲得上次運行logrotate的時間 ---> 根據/etc/anacrontab的配置執行/etc/cron.daily/etc/cron.weekly/etc/cron.monthly ---> 執行/etc/cron.daily/下的logrotate腳本 ---> 執行logrotate ---> 根據/etc/logrotate.conf配置執行腳本/etc/logrotate.d/nginx ---> 轉儲nginx日志成功

logrotate使用

/etc/logrotate.d/下面新建文件nginxLogrotate

vim /etc/logrotate.d/nginxLogrotate

添加如下:

/home/APPDeploy/nginx-1.16.0/logs/*.log {               #日志文件所在的路徑
        daily                                           #每天進行日志分割
        missingok                                       #在日志轉儲期間,任何錯誤將被忽略
        rotate 30                                       #保留30個備份
        compress                                        #通過gzip壓縮轉儲以后的日志
        delaycompress                                   #delaycompress和compress一起使用時,轉儲的日志文件到下一次轉儲時才壓縮,即這次切割的日志不壓縮
        dateext                                         #日志后面帶時間,如:nginx.access.log-20190516
        #dateformat -%Y%m%d%s                           #日志時間格式
        #dateyesterday                                  #如果定時任務時間設置的是0點就要配置此項,不然切割的內容是昨天的但是日志名卻是當天的.
        notifempty                                      #當日志文件為空時,不進行輪轉
        create 644 APPDeploy APPDeploy                  #輪轉時指定創建新文件的屬性
        sharedscripts                                   #運行postrotate腳本,作用是在所有日志都輪轉后統一執行一次腳本。如果沒有配置這個,那么每個日志輪轉后都會執行一次腳本
        postrotate                                      #在logrotate轉儲之后需要執行的指令,下面的腳本作用是讓nginx將日志內容存儲在新的日志文件中.
                if [ -f /home/APPDeploy/nginx-1.16.0/run/nginx.pid ]; then
                        kill -USR1 `cat /home/APPDeploy/nginx-1.16.0/run/nginx.pid`
                fi
        endscript
}
  • 測試是否生效

logrotate -vfd /etc/logrotate.d/nginxAccessLog # 以debug測試是否生效,不會真的切割日志

logrotate -fv /etc/logrotate.d/nginxAccessLog # 強制生效並顯示詳細的輸出信息

詳細信息請用man logrotate查看

logrotate生效時間

要想知道logrotate什么時候執行日志分割操作,需要關注/etc/anacrontab/var/lib/logrotate/logrotate.status這兩個文件.

上文中已介紹過/var/lib/logrotate/logrotate.status這里就不在贅述了.

/etc/anacrontab是使logrotate按時執行腳本的主要配置文件,我們來仔細看下anacrontab的主要內容:

sudo cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

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=03-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

從上面的內容可以看出:如果機器沒有關機,默認的logrotate(配置文件里設置的是cron.daily)一般會在每天的3點05分到3點50分之間執行,真實的延遲時間是 RANDOM_DELAY + delay in minutes.

如果在3-22這個時間段內服務器處於關機狀態,則logrotate會在機器開機5分鍾后執行分割日志的操作.

注意

不建議直接修改此文件,如果想修改logrotate默認的執行時間,可通過crontab執行自定義的logrotate配置文件,但這時就不能將自定義的配置文件放置在 /etc/logrotat.d/下了,應該放置在/etc/logrotat.d/下層目錄或者另外的路徑,否則就會執行兩遍日志分割的操作,執行時間分別是你在crontab中定義的時間以及anacrontab默認的執行時間即3:05-3:50。

更多的信息請用man anacrontab查看.

自定義logrotate執行時間

正常的日志分割都是按天進行的,即每個日志只記錄0-24點之間的內容,如果是按默認的anacrontab設定的執行時間那肯定是不行的,具體實現其實有兩種方法:

  • 方法1(推薦):

1: 在/etc/logrotate.d創建下層目錄,mkdir -p /etc/logrotate.d/nginx ,當然也可在非/etc/logrotate.d/下創建此目錄,例如我是在/etc/logrotate.daily.0下創建了nginxLogrotate文件.

2: 移除之前自定義的配置文件,sudo mv /etc/logrotate.d/nginxLogrotate ~/bak/,這樣做的作用就是防止執行兩次日志分割腳本的操作.

3: 添加crontab計划任務, sudo echo "59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.daily.0/nginxLogrotate >/dev/null 2>&1" > /etc/crontab

當然也可直接在root用戶下執行crontab -e然后添加上面的內容.

如果用非root用戶則會報錯error: error creating output file /var/lib/logrotate/logrotate.status.tmp: 權限不夠

4: 重啟crontab,service crond restart,其實可以不用重啟.

注意

如果crontab中定義的執行時間是0點,則需要在/etc/logrotate.d/nginx/nginxLogrotate里添加上dateyesterday這個選項,否則日志內容記錄的是昨天的,而 日志名稱格式卻是今天的,但crontab中定義的執行時間是23:59這樣的則不用添加dateyesterday選項.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM