被遗忘的 Logrotate

转载 2016年01月22日 14:07:47

转自: http://huoding.com/2013/04/21/246


被遗忘的 Logrotate

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

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,有兴趣可以看看。


被遗忘的Logrotate

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

容易被遗忘的CSS3新属性

容易被忽略的CSS3新属性 tap-highlight-color:设置可点击元素的高亮颜色。在移动端开发时一般要设置为rgba(0, 0, 0, 0)。但是由于是不规范属性,所以一般要加上前缀-we...
  • l522703297
  • l522703297
  • 2016-02-29 11:26:45
  • 465

被遗忘的世界

 被遗忘的世界我一个人,活在自己的世界。那是一个,被人遗忘的世界。我一个人,这个世界所抛弃。没有一个,能够不会所抛弃。虽然,现代社会已经进步,人民的观念有了很大的变化。只是,良心的冷漠并不是一件坏事,...
  • zentaya
  • zentaya
  • 2008-07-31 14:43:00
  • 135

logrotate 日志清理后 rsyslog中断问题

随后配置logrotate的配置文件/etc/logrotate.conf,加入下面的内容: /var/log/ipwall/messages.log { #日志路径一定要和rsyslog定义的日...
  • zhaoyangjian724
  • zhaoyangjian724
  • 2016-08-12 20:39:23
  • 1292

我们不怕死,我们怕被遗忘

湛蓝的大海,金黄色的沙滩,在法兰西六月的晨风中,一队身着军服的耄耋老人蹒跚着走来。清朗的阳光打在他们脸上,他们胸前的勋章熠熠生辉。军乐队奏响了迎宾曲,礼炮轰鸣,年轻的军官和士兵们庄严地抬起右臂——老人...
  • programpoet
  • programpoet
  • 2009-09-16 14:16:00
  • 1318

rsyslog、logrotate切割保存日志日期不准确的问题

相信用过rsyslogd  logrotate转存切割日志的同学,都会发现日志转存后的文件,会出现日期不准确的问题 例如:6月21号生成的日志,无缘无故转存到了6月22号的文件里,日期提前了一天。 又...
  • a_tu_
  • a_tu_
  • 2017-06-22 09:06:39
  • 1120

查看logrotate生效时间

昨天配置了一个logrotate,今天一看03:45生成了一个文件,我就想为什么是这个时间呢。 从网上查看了一下,记录如下 cat /etc/anacrontab 里面有个 START_HOURS_R...
  • zgrbsbf
  • zgrbsbf
  • 2017-06-28 11:06:31
  • 1225

如何使log文件达到指定大小就转储(logrotate)

Linux logrotate 问题:如何使Log文件一达到指定大小就转储     这个问题用crond做不了,因为他的检测间隔就是一分钟,你如果想在两次cron执行的间隔中,log文件的大小达到或超...
  • hxh129
  • hxh129
  • 2012-11-13 15:01:37
  • 2585

日志文件的轮替(logrotate)

logrotate是在规定时间到了之后才来进行日志文件的轮替,所以logrotate程序是挂在cron下面进行的,/etc/cron.daily/logrotate记录了每天要进行的日志文件轮替行为。...
  • weiguang1017
  • weiguang1017
  • 2016-09-05 11:42:30
  • 2383

Linux 日志管理 Logrotate

被遗忘的Logrotate 发表于2013-04-21 我发现很多人的服务器上都运行着一些诸如每天切分Nginx日志之类的CRON脚本,大家似乎遗忘了Logrotate,争相发明自己的...
  • abccheng
  • abccheng
  • 2016-05-16 09:48:22
  • 1829
收藏助手
不良信息举报
您举报文章:被遗忘的 Logrotate
举报原因:
原因补充:

(最多只允许输入30个字)