Written by
arstercz
-
logrotate日志分割
/etc/logrotate.d/目录存在各种服务:如squid、nginx、httpd等
# less /etc/logrotate.d/squid
/web/squid/logs/access.log /web/squid/logs/cache.log /web/squid/logs/store.log {
daily
missingok
nocompress
noolddir
sharedscripts
postrotate
DATE=`/bin/date--date=yesterday +%y%m%d`
LOGDIR="/web/squid/logs"
/usr/sbin/squid -k rotate 2>/dev/null || true
sleep 10
for LOGFILE in ${LOGDIR}/*.log; do
[ -f ${LOGFILE}.1 ] && mv ${LOGFILE}.1 ${LOGFILE}-${DATE}
[ -f ${LOGFILE}-${DATE} ] && /bin/gzip ${LOGFILE}-${DATE}
done
/usr/bin/find ${LOGDIR}/ -type f -name"*.log-*.gz" -mtime +180 -exec rm -f {} \;
endscript
}
该脚本执行logrotate命令:
# cat /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
conf配置文件,注意include选项
# cat /etc/logrotate.conf
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
查看/etc/crontab文件,这是crontab的默认参数
# cat /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
run-parts /etc/cron.daily 执行命令执行了改目录下的所有脚本,如下:
# ls /etc/cron.daily/
0logwatch cups logrotate makewhatis.cron mlocate.cron prelink rpm tmpwatch
这个流程是,cron 负责调度,crond 读 /etc/crontab 获得配置, /etc/crontab 包含 /etc/cron.daily 目录下的所有配置,而 logrotate 则是其中的一个任务;logrotate 每天 4 点 2 分开始跑,logrotate 又读自己的配置 /etc/logrotate.conf,logrotate.conf 包含 /etc/logrotate.d 下的配置,squid 是其中的一个。
为了避免重复操作,logrotate 会记一个状态在 /var/lib/logrotate.status 文件中,故/usr/sbin/logrotate /etc/logrotate.conf 命令一直无效,-f参数强制执行会覆盖已有的数据