我正在使用默认的rsyslog和logrotate工具在Ubuntu 14上工作。
在默认的rsyslog logrotate /etc/logrotate.d/rsyslogconfiguration我看到以下内容:
/var/log/syslog { rotate 7 daily missingok notifempty delaycompress compress postrotate reload rsyslog >/dev/null 2>&1 || true endscript }
据我所知,build议在所有logrotatescheme中使用copytruncate,因为它不会移动当前日志,而是截断日志,所以任何具有打开文件处理程序的进程都可以继续写入日志。
那么为什么使用rsyslog重载function的默认configuration呢?
要回答你的问题,你需要了解重载和copytruncate的不同权衡:
这完全取决于进程如何写日志。
如果日志消息被追加到文件(例如, whatever >> logfile文件), copytruncate只能起作用。
而不是当它redirect输出(例如whatever > logfile )。
从版本8.16开始,rsyslog具有处理copytruncte问题的imfile选项reopenOnTruncate 。
对于rsyslog而言,将事情保持原样可能更有意义。
基本的原因是rsyslog有内部队列,可以在输出句柄不可用的情况下使用。
重新加载将a)导致rsyslog重新创build自己的日志文件,以及b)在创build时导致任何排队的事件被刷新到文件。
它可能是copytruncate没有害处(虽然我会担心部分写入的行被截断),但我会倾向于认为从完整性的angular度来看,复制/删除/重新加载是“更安全”。
正如@ faker所提到的,由于rsyslog可以处理文件变得不可用的情况,所以没有令人信服的理由来使用copytruncate。
正如@ SelivanovPavel所提到的,rsyslog实际上需要特定的configuration才能正确地处理复制截断。
所以,如果只是因为使用reload方法需要较less的偏离默认configuration,我会保持它。