在linux下的日誌會定期進行回滾,控制系統執行日誌回滾操作的配置文件主要有:/etc/logrotate.conf 以及 /etc/logrotate.d/ 這個目錄下的明細配置文件。
/etc/logrotate.d/ 這個目錄下的每個配置文件,都對應相應的系統服務,爲每種服務設定特點的日誌回滾機制,比如syslogd
/etc/logrotate.conf 這個文件是默認的日誌回滾操作配置文件,在/etc/logrotate.d/ 這個目錄下沒有明細配置文件的系統日誌,會依照該文件執行日誌回滾。
/etc/logrotate.conf 解釋
這個配置文件在不同的linux發行版本之間大同小異,其中默認配置項爲:
weekly每週進行一次日誌回滾操作
rotate 4執行回滾操作時,每次只保留四個文件
create執行回滾操作時,建立新的文件來繼續記錄日誌,把回滾後的日誌文件重命名
dateext使用日期來爲回滾後的日誌文件命名
/etc/logrotate.d/ 下的明細配置文件解釋,這裏以syslog 爲例
SUSE :
/etc/logrotate.d/syslog
/var/log/warn /var/log/messages /var/log/allmessages /var/log/localmessages /var/log/firewall { 須要進行回滾的日誌文件,在大括號內配置執行回滾的操作方式。
compress對回滾後的日誌文件進行壓縮
dateext使用日期來爲回滾後的日誌文件命名
maxage 365執行回滾操作的時間爲365天,達到這個時間後,就會刪除所有的回滾日誌文件,重新開始記錄日誌
rotate 99每次保留99個文件
missingok如果日誌文件丟失,繼續記錄下一個日誌文件,並不發送錯誤信息
notifempty 如果日誌文件時空的,則不進行回滾操作
size +4096k回滾時的日誌文件增量爲4096k 如果沒有"+" 則表示超過這個值就執行一次回滾
create 640 root root改變回滾後的文件的權限和所屬用戶組
sharedscripts執行完一次回滾操作後執行的腳本
postrotate
/etc/init.d/syslog reload 這裏所執行的腳本是重新加載syslog這個系統服務
endscript
}
RedHat:
/etc/logrotate.d/rsyslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
sharedscripts
在RedHat Linux下的明細配置文件相對簡單,在執行完一次回滾操作後,kill 掉syslog這個系統服務的進程,實際上就是執行一次 /etc/init.d/syslog restart,其他的操作則按照/etc/logrotate.conf 的配置進行。
日誌回滾的執行時間由計劃任務crontab,來控制,由於日誌的回滾操作每天都在進行,特別是系統日誌(syslog),回滾操作的計劃執行由文件:/etc/cron.daily/logrotate 來控制,而系統每天的計劃任務則由文件:/etc/crontab來控制:
SUSE:
/etc/cron.daily/logrotate
#!/bin/sh
TMPF=`mktemp /tmp/logrotate.XXXXXXXXXX`
/usr/sbin/logrotate /etc/logrotate.conf 2>&1 | tee $TMPF
EXITVALUE=${PIPESTATUS[0]}
if [ $EXITVALUE != 0 ]; then
# wait a sec, we might just have restarted syslog
sleep 1
# tell what went wrong
/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
/bin/logger -t logrotate -f $TMPF
fi
rm -f $TMPF
exit 0
/etc/crontab
SHELL=/bin/sh
RedHat:
/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
/etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly