The man page of logrotate
says that:
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.
I'm confused by this. If a program cannot be told to close its logfile, it will continue to write forever, not for sometime. If the compression is postponed to next rotation cycle, the program continues to write to that file even after the next rotation cycle. How is postponing solving the problem?
My understanding is that copytruncate
should be used when a program cannot be told to close the logfile. I'm aware that some data written to the logfile gets lost when the copy is in progress.
I was looking at the logrotate file for couchdb, and it had both copytruncate
and delaycompress
options.
/usr/local/couchdb-1.0.1/var/log/couchdb/*.log {
weekly
rotate 10
copytruncate
delaycompress
compress
notifempty
missingok
}
It looks like there is no point using delaycompress
when copytruncate
is already there. What am I missing?
Best Answer
Your understanding of
copytruncate
is correct, but the wording in the manpage fordelaycompress
is a little misleading. More properly, it should say "when some program cannot be told to immediately close it's logfile" -- for instance, if you're using sharedscripts and the script sends a signal to the process using the log when all the log files have been rotated.