Apache使用当前和归档的不同名称进行日志转换

我在CentOS 6.5上运行Apache 2.2,我想要做的就是使用Apache的当前访问日志文件:

/var/log/httpd/access_log 

每天午夜,该文件被重新命名为(假设2014-09-22是刚通过的date):

 /var/log/httpd/access_log.2014-09-22 

…并在access_log创build一个新的日志文件( access_log ),Apache继续logging。 我怎样才能做到这一点? 我已经设置了这个CustomLog指令:

 CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/access_log.%Y-%m-%d 86400" combined 

但是,如果今天是2014-09-22,则会导致当前(活动)日志文件被命名为access_log.2014-09-22

我可以想到一个hacky的解决scheme,我有一个脚本,在午夜后运行,并将/var/log/httpd/access_log设置为当前日志文件的符号链接。 (这将基于date,所以即使它是一个低stream量的服务器,并且新的日志文件还不存在,符号链接将是正确的,只要任何请求到达服务器就会起作用)。 但似乎必须有一个更优雅的方式来做到这一点。 有什么办法来告诉旋转日志使用一个文件名为当前日志,并为旋转的日志不同的文件名? 如果没有,那么有没有其他的干净的方式来做我想要的?

编辑:每天重新启动Apache不是一个选项。

查看log rotate的手册页显示dateext以及dateformat可以用来实现这个目标。

  • dateext:存档旧版本的日志文件,添加像YYYYMMDD这样的日常扩展,而不是简单地添加一个数字。 该扩展可以使用dateformat选项进行configuration。

  • dateformat (format_string):使用类似于strftime(3)函数的表示法指定date分机的扩展名。 只有%Y%m%d和%s说明符是允许的。 默认值是 – %Y%m%d。 请注意,从扩展名中分隔日志名称的字符也是dateformatstring的一部分。 系统时钟必须设置在2001年9月9日以后%s才能正常工作。 请注意,由这种格式生成的date戳必须在词法上可sorting(即首先是一年,然后是一个月,然后是一天。例如,2001/12/01是可以的,但01/12/2001不是,从01/11 / 2002年的时候会降低)。 这是因为使用旋转选项时,日志旋转对所有旋转的文件名进行sorting,以找出哪些日志文件比较旧,应该删除。

所以使用一个相当简单的logrotate脚本,我使用Ubuntu的Apache设置,你可以这样做:

 /var/log/apache2/*.log { weekly missingok rotate 26 compress dateext dateformat %Y-%m-%d delaycompress notifempty create 640 root www-data sharedscripts postrotate /etc/init.d/apache2 reload > /dev/null endscript prerotate if [ -d /etc/logrotate.d/httpd-prerotate ]; then \ run-parts /etc/logrotate.d/httpd-prerotate; \ fi; \ endscript } 

使用cronolog 。

 CustomLog "|/usr/sbin/cronolog \ -S /var/log/httpd/access_log /var/log/httpd/access_log.%Y-%m-%d" combined 

这与您的“hacky解决scheme”类似,因为每个日志都将名为access_log.YYYY-MM-DD,包括活动日志。 但是cronolog会为你保留符号链接(-S),这样/ var / log / httpd / access_log总是指向当前的日志。 作为一个奖励,当这一天结束时,这将自动发生 – 不需要logrotate cron作业。