Apache 日志轮换:logrotate、rotatelogs 和 chronolog

Apache 日志轮换:logrotate、rotatelogs 和 chronolog

我一直在研究如何为我的服务器轮换日志,该服务器托管约 5 个流量相当大的网站。据我所知,我的选择是使用 logrotate 或使用管道日志记录(rotatelogs 或 chronolog)。

logrotate 需要重新启动 apache,而 SIGHUP 和 SIGUSR1 重新启动在高流量站点上都不太理想,因为您要么断开大量连接,要么需要延迟压缩旧日志,直到所有子进程都自然死亡。此外,如果启用了压缩,停机时间可能会相当长。使用 logrotate(不带压缩并优雅重启)并在事后压缩旧日志是否是最大限度减少停机时间的最佳方法?

chronolog 和 rotatelogs 听起来很有前途,但没有很好的文档记录。我找不到将它们与 vhost 特定日志结合使用的示例。chronolog 网站说,“当扩展文件名发生变化时,当前文件将关闭并打开一个新文件”。这是全局的吗?还是每个 AccessLog、CustomLog 或 ErrorLog 指令都适用?

chronolog 和 rotatelogs 之间有显著区别吗?

答案1

我认为从稳定性的角度考虑,让 apache 将日志写入文件是首选解决方案。想象一下,如果您的系统日志发生故障,或者管道命令出现错误,会发生什么?

为什么不编写自己的轮换脚本?您可以使用以下算法来避免丢失数据和任何停机时间。

假设你需要轮换文件 big_access_log

  1. 将 big_access_log 重命名为 .big_access_log_rotating
  2. 向 apache 发送 HUP 信号。它将重新打开(重新创建)big_access_log。
  3. 使用任何你喜欢的工具以任何优先级压缩 .big_access_log_rotating。

就我个人而言,我只使用 logrotate,我不太关心可能会丢失的一些数据,但我认为 logrotate 足够智能,可以以原子方式进行旋转。

答案2

如果您将 Apache 设置为通过 syslog 进行记录,并且还使用 rsyslog 来处理记录,则可以配置 rsyslog 以将日志发送到根据当前日期命名的文件中。这样就无需重新启动 Apache,并且您可以轻松地轮换较旧的日志文件。

请查看以下网站以了解更多信息:

http://wiki.rsyslog.com/index.php/Working_Apache_and_Rsyslog_configuration

http://wiki.rsyslog.com/index.php/DailyLogRotation

答案3

您可以做的另一件事是设置执行以下操作的 cronjob:

/usr/bin/find /path/to/logs -name access.log | \
    /usr/bin/sort | \
    /usr/bin/head --lines=-1 | \
    /usr/bin/xargs -r /usr/bin/bzip2 -9

这假设未压缩的访问日志可以轻松按时间顺序排序。最后一行(将是当前日志)被忽略,其余日志文件被压缩。如果没有,-rxargs 上的标志意味着不会运行该命令。

如果需要的话,可以进一步调整以同时压缩多个日志

相关内容