FROM : http://huoding.com/2013/04/21/246
我發現很多人的伺服器上都運作着一些諸如每天切分Nginx日志之類的CRON腳本,大家似乎遺忘了Logrotate,争相發明自己的輪子,這真是讓人沮喪啊!就好比明明身邊躺着現成的性感美女,大家卻忙着自娛自樂,罪過!
Logrotate的介紹
顯而易見,Logrotate是基于CRON來運作的,其腳本是「/etc/cron.daily/logrotate」:
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
實際運作時,Logrotate會調用配置檔案「/etc/logrotate.conf」:
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp -- we'll rotate them here
/var/log/wtmp {
monthly
minsize 1M
create 0664 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
這裡的設定可以了解為Logrotate的預設值,當然了,可以我們在「/etc/logrotate.d」目錄裡放置自己的配置檔案,用來覆寫Logrotate的預設值。
Logrotate的示範
按天儲存一周的Nginx日志壓縮檔案,配置檔案為「/etc/logrotate.d/nginx」:
/usr/local/nginx/logs/*.log {
daily
dateext
compress
rotate 7
sharedscripts
postrotate
kill -USR1 `cat /var/run/nginx.pid`
endscript
}
如果你等不及CRON,可以通過如下指令來手動執行:
shell> logrotate -f /etc/logrotate.d/nginx
當然,正式執行前最好通過Debug選項來驗證一下,這對調試也很重要:
shell> logrotate -d -f /etc/logrotate.d/nginx
BTW:類似的還有Verbose選項,這裡就不多說了。
Logrotate的疑問
問題:sharedscripts的作用是什麼?
大家可能注意到了,我在前面Nginx的例子裡聲明日志檔案的時候用了星号通配符,也就是說這裡可能涉及多個日志檔案,比如:access.log和error.log。說到這裡大家或許就明白了,sharedscripts的作用是在所有的日志檔案都輪轉完畢後統一執行一次腳本。如果沒有配置這條指令,那麼每個日志檔案輪轉完畢後都會執行一次腳本。
問題:rotate和maxage的差別是什麼?
它們都是用來控制儲存多少日志檔案的,差別在于rotate是以個數為機關的,而maxage是以天數為機關的。如果我們是以按天來輪轉日志,那麼二者的差别就不大了。
問題:為什麼生成日志的時間是淩晨四點?
前面我們說過,Logrotate是基于CRON運作的,是以這個時間是由CRON控制的,具體可以查詢CRON的配置檔案「/etc/crontab」,可以手動改成如23:59等時間執行:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
59 23 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
問題:如何告訴應用程式重新打開日志檔案?
以Nginx為例,是通過postrotate指令發送USR1信号來通知Nginx重新打開日志檔案的。但是其他的應用程式不一定遵循這樣的約定,比如說MySQL是通過flush-logs來重新打開日志檔案的。更有甚者,有些應用程式就壓根沒有提供類似的方法,此時如果想重新打開日志檔案,就必須重新開機服務,但為了高可用性,這往往不能接受。還好Logrotate提供了一個名為copytruncate的指令,此方法采用的是先拷貝再清空的方式,整個過程中日志檔案的操作句柄沒有發生改變,是以不需要通知應用程式重新打開日志檔案,但是需要注意的是,在拷貝和清空之間有一個時間差,是以可能會丢失部分日志資料。
BTW:MySQL日志輪轉詳見「Rotating MySQL Slow Logs Safely」。
…
熟悉Apache的朋友可能會記得cronolog,不過Nginx并不支援它,有人通過mkfifo指令曲線救國,先給日志檔案建立管道,再搭配cronolog輪轉,雖然理論上沒有問題,但效率上有折扣。另外,Debian/Ubuntu下有一個簡化版工具savelog,有興趣可以看看。
轉載于:https://www.cnblogs.com/imbin/p/3180613.html