我发现很多人的服务器上都运行着一些诸如每天切分Nginx日志之类的CRON脚本,大家似乎遗忘了Logrotate,争相发明自己的轮子,这真是让人沮丧啊!就好比明明身边躺着现成的性感美女,大家却忙着自娱自乐,罪过!

Logrotate的介绍

logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,我们把它叫做“转储”。我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行。
logrotate 程序还可以用于压缩日志文件,以及发送日志到指定的E-mail 。
显而易见,Logrotate是基于CRON来运行的,其脚本是「/etc/cron.daily/logrotate」:
  1. [caoxiaojian@web1 etc]$ cat /etc/cron.daily/logrotate
  2. #!/bin/sh
  3. /usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
  4. EXITVALUE=$?
  5. if [ $EXITVALUE != 0 ]; then
  6. /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
  7. fi
  8. exit 0
实际运行时,Logrotate会调用配置文件「/etc/logrotate.conf」:
  1. [caoxiaojian@web1 etc]$ cat /etc/logrotate.conf
  2. # see "man logrotate" for details
  3. # rotate log files weekly
  4. weekly
  5. # keep 4 weeks worth of backlogs
  6. rotate 4
  7. # create new (empty) log files after rotating old ones
  8. create
  9. # use date as a suffix of the rotated file
  10. dateext
  11. # uncomment this if you want your log files compressed
  12. #compress
  13. # RPM packages drop log rotation information into this directory
  14. include /etc/logrotate.d
  15. # no packages own wtmp and btmp -- we'll rotate them here
  16. /var/log/wtmp {
  17. monthly
  18. create 0664 root utmp
  19. minsize 1M
  20. rotate 1
  21. }
  22. /var/log/btmp {
  23. missingok
  24. monthly
  25. create 0600 root utmp
  26. rotate 1
  27. }
  28. # system-specific logs may be also be configured here.
这里的设置可以理解为Logrotate的缺省值,当然了,可以我们在「/etc/logrotate.d」目录里放置自己的配置文件,用来覆盖Logrotate的缺省值。

Logrotate的演示

按天保存一周的Nginx日志压缩文件,配置路径为:/etc/logrotate.d,创建一个nginx的文件
  1. /usr/local/nginx/logs/*.log {
  2. daily
  3. dateext
  4. compress
  5. rotate 7
  6. sharedscripts
  7. postrotate
  8. kill -USR1 `cat /var/run/nginx.pid`
  9. endscript
  10. }
如果你等不及CRON,可以通过如下命令来手动执行:
  1. [caoxiaojian@web1 etc]$ logrotate -f /etc/logrotate.d/nginx
当然,正式执行前最好通过Debug选项来验证一下,这对调试也很重要:
  1. [caoxiaojian@web1 etc]$ logrotate -d -f /etc/logrotate.d/nginx

参数 功能

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 (缺省)以及KB (sizek)或者MB (sizem).

Logrotate的疑问

问题:sharedscripts的作用是什么?

大家可能注意到了,我在前面Nginx的例子里声明日志文件的时候用了星号通配符,也就是说这里可能涉及多个日志文件,比如:access.log和error.log。说到这里大家或许就明白了,sharedscripts的作用是在所有的日志文件都轮转完毕后统一执行一次脚本。如果没有配置这条指令,那么每个日志文件轮转完毕后都会执行一次脚本。

官方配置解析











05-11 14:02