何时在 logrotate 中使用 delaycompress 选项?

何时在 logrotate 中使用 delaycompress 选项?

的手册页logrotate指出:

It can be used when some program cannot be told to close its logfile
and  thus  might  continue writing to the previous log file for some
time.

我对此感到困惑。如果程序无法关闭其日志文件,它将继续写入永远, 不是为了有时。如果压缩被推迟到下一个循环周期,程序即使在下一个循环周期之后仍会继续写入该文件。推迟如何解决问题?

我的理解是,copytruncate当无法指示程序关闭日志文件时,应该使用。我知道在复制过程中写入日志文件的一些数据会丢失。

我正在查看 couchdb 的 logrotate 文件,它有copytruncatedelaycompress选项。

/usr/local/couchdb-1.0.1/var/log/couchdb/*.log {
   weekly
   rotate 10
   copytruncate
   delaycompress
   compress
   notifempty
   missingok
}

看起来使用已经存在的delaycompresswhencopytruncate是没有意义的。我遗漏了什么?

答案1

您对 的理解copytruncate是正确的,但是 的手册页中的措辞delaycompress有点误导。更正确的是,它应该说“当某个程序无法被告知立即地关闭它的日志文件”——例如,如果您使用共享脚本,并且当所有日志文件都已轮换时,脚本会使用日志向进程发送信号。

答案2

我们用:

  • 日常的
  • 延时压缩
  • 日期文本

这会创建 apache 的固定副本access_log access_log.1,以便我们可以在一天结束时将我们的统计包作为脚本运行。

第二天 logrotate 压缩文件创建access_log.2.zip

答案3

不确定我是否完全理解了你的问题,但如果你问我的想法......我会使用这个:

postrotate
          killall -HUP syslog-ng
  endscript

这是终止日志并转到下一个日志的好方法(至少是方法之一)。对于糟糕的“程序”,例如每秒记录大量数据的 Cisco ASA 平台,这种方法很有效。

答案4

原因是软件会自行执行轮换。这通常是通过将当前日志复制到新创建的文件,然后截断原始文件来完成的。这可能需要一些时间,并且 logrotate 没有任何机制来发信号通知文件已准备好压缩。

Logrotate 只能用于压缩和维护档案,而不是执行实际的轮换。

相关内容