一、 logrotate 配置
logrotate
程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,我们把它叫做 “ 转储 ” 。我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行。
logrotate
程序还可以用于压缩日志文件,以及发送日志到指定的 E-mail 。
logrotate
的配置文件是 /etc/logrotate.conf 。主要参数如下表:
参数 功能
compress
通过 gzip 压缩转储以后的日志
nocompress
不需要压缩时,用这个参数
copytruncate
用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate
备份日志文件但是不截断
create mode owner group
转储文件,使用指定的文件模式创建新的日志文件
nocreate
不建立新的日志文件
delaycompress
和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress
覆盖 delaycompress 选项,转储同时压缩。
errors address
专储时的错误信息发送到指定的 Email 地址
ifempty
即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty
如果是空文件的话,不转储
mail address
把转储的日志文件发送到指定的 E-mail 地址
nomail
转储时不发送日志文件
olddir directory
转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir
转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript
在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript
在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
daily
指定转储周期为每天
weekly
指定转储周期为每周
monthly
指定转储周期为每月
rotate count
指定日志文件删除之前转储的次数, 0 指没有备份, 5 指保留 5 个备份
tabootext [+] list
让 logrotate 不转储指定扩展名的文件,缺省的扩展名是: .rpm-orig,.rpmsave, v, 和 ~
size size 当日志文件到达指定的大小时才转储, Size 可以指定 bytes( 缺省 ) 以及 K(sizek) 或者 M (sizem).
二、缺省配置 logrotate
logrotate 缺省的配置募 /etc/logrotate.conf 。
Red Hat linux
缺省安装的文件内容是:
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# send errors to root
errors root
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
1
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own lastlog or wtmp --we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}
/var/log/lastlog {
monthly
rotate 1
}
# system-specific logs may be configured here
缺省的配置一般放在 logrotate.conf 文件的最开始处,影响整个系统。在本例中就是前面 12 行。
第三行 weekly 指定所有的日志文件每周转储一次。
第五行 rotate 4 指定转储文件的保留 4 份。
第七行 errors root 指定错误信息发送给 root 。
第九行 create 指定 logrotate 自动建立新的日志文件,新的日志文件具有和
原来的文件一样的权限。
第 11 行 #compress 指定不压缩转储文件,如果需要压缩,去掉注释就可以了。
三、使用 include 选项读取其他配置文件
include
选项允许系统管理员把分散到几个文件的转储信息,集中到一个
主要的配置文件。当 logrotate 从 logrotate.conf 读到 include 选项时,会从指定文件读入配置信息,就好像他们已经在 /etc/logrotate.conf 中一样。
第 13 行 include/etc/logrotate.d 告诉 logrotate 读入存放在 /etc/logrotate.d 目录中的日志转储参数,当系统中安装了 RPM 软件包时,使用 include 选项十分有用。 RPM 软件包的日志转储参数一般存放在 /etc/logrotate.d 目录。
include
选项十分重要,一些应用把日志转储参数存放在 /etc/logrotate.d,/etc/logrotate.d/里的每个文件配置会覆盖或追加该文件默认的参数,如果未指定参数,则采用logrotate.conf中默认的参
数,比如logrotate.conf中,rotate默认为4, test(四章中的例子)文件指定rotate为50,将覆盖rotate配置,
典型的应用有: apache, linuxconf,samba, cron 以及 syslog,squid 。
这样,系统管理员只要管理一个 /etc/logrotate.conf 文件就可以了。
logrotate 也可以直接执行 后直接跟配置文件就可以了。
-v 给出详细信息
-d debug模式,不更改日志文件内容 模拟执行
-f 强制执行,忽略所有规则
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 如果使用的是新版CentOS,那么配置文件为:/etc/anacrontab。
问题:如何告诉应用程序重新打开日志文件?
以Nginx为例,是通过postrotate指令发送USR1信号来通知Nginx重新打开日志文件的。但是其他的应用程序不一定遵循这样的约
定,比如说MySQL是通过flush-logs来重新打开日志文件的。更有甚者,有些应用程序就压根没有提供类似的方法,此时如果想重新打开日志文件,
就必须重启服务,但为了高可用性,这往往不能接受。还好Logrotate提供了一个名为copytruncate的指令,此方法采用的是先拷贝再清空的
方式,整个过程中日志文件的操作句柄没有发生改变,所以不需要通知应用程序重新打开日志文件,但是需要注意的是,在拷贝和清空之间有一个时间差,所以可能
会丢失部分日志数据。
BTW:MySQL本身在support-files目录已经包含了一个名为mysql-log-rotate的脚本,不过它比较简单,更详细的日志轮转详见「Rotating MySQL Slow Logs Safely」。
…
熟悉Apache的朋友可能会记得cronolog,不过Nginx并不支持它,有人通过mkfifo命令曲线救国,先给日志文件创建管道,再搭配cronolog轮转,虽然理论上没有问题,但效率上有折扣。另外,Debian/Ubuntu下有一个简化版工具savelog,有兴趣可以看看。
|