轉: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選項.