的手册页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 文件,它有copytruncate
和delaycompress
选项。
/usr/local/couchdb-1.0.1/var/log/couchdb/*.log {
weekly
rotate 10
copytruncate
delaycompress
compress
notifempty
missingok
}
看起来使用已经存在的delaycompress
whencopytruncate
是没有意义的。我遗漏了什么?
答案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 只能用于压缩和维护档案,而不是执行实际的轮换。