充分挖掘利用系统自带的好工具Logrotate

     logrotate这个系统原生的工具很少被利用起来,好多时候都写shell,然后通过crontab去调用来达到某种例行的任务,太多此一举了,系统自带的logrotate多方便啊,不用配置crontab,减少一次出现错误的机会,对于SA来说简直就是福利.

     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(默认是logrotate的缺省值)

# 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

# use date as a suffix of the rotated file
dateext

# 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 and btmp — we’ll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
        minsize 1M
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

# system-specific logs may be also be configured here.

    把我们需要的配置文件放入/etc/logrotate.d即可覆盖缺省值的配置.

    利用logrotate来处理nginx的日志.

     vim /etc/logrotate.d/nginx

/usr/local/nginx/logs/*.log {
daily
rotate 5
missingok
notifempty
sharedscripts
postrotate
    if [ -f /usr/local/nginx/logs/nginx.pid ]; then
        kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
    fi
endscript
}

可以通过手动的方式执行logrotae –f /etc/logrotate.d/nginx来验证,最好在正式执行前开启debug(来看看运行的情况.

logrotate –d –f  /etc/logrotate.d/nginx

疑问:

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

如果使用的是新版CentOS,那么配置文件为:/etc/anacrontab

如何告诉应用程序重新打开日志文件?

以Nginx为例,是通过postrotate指令发送USR1信号来通知Nginx重新打开日志文件的。但是其他的应用程序不一定遵循这样的约定,比如说MySQL是通过flush-logs来重新打开日志文件的。更有甚者,有些应用程序就压根没有提供类似的方法,此时如果想重新打开日志文件,就必须重启服务,但为了高可用性,这往往不能接受。还好Logrotate提供了一个名为copytruncate的指令,此方法采用的是先拷贝再清空的方式,整个过程中日志文件的操作句柄没有发生改变,所以不需要通知应用程序重新打开日志文件,但是需要注意的是,在拷贝和清空之间有一个时间差,所以可能会丢失部分日志数据。

扩展:

apache的话可以使用cronolog来完成日志的轮训.nginx也可以 使用一下脚本完成日志的切割

#!/bin/bash
set +x

#set the path to nginx log files
log_files_path=”/data/logs/”

#the nginx log dir
log_files_dir=”/usr/local/nginx/logs/”

#set nginx log files you want to cut
log_files_name=access

#set the path to nginx.
nginx_sbin=”/usr/local/nginx/sbin/nginx”

#Set how long you want to save
save_days=4
domain=”www.lijun.me”

############################################
#cut nginx log files
############################################
mv $log_files_dir/$log_files_name.log $log_files_path/${domain}_$(date -d “yesterday” +”%Y%m%d”).log
#delete save days ago nginx log files
cd $log_files_path
find $log_files_path -mtime +$save_days -exec rm {} \;
$nginx_sbin -s reload

此条目发表在Knowledge分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注