logrotate移动之后如何继续将stdoutredirect到文件?

我有一个简单的脚本输出一堆日志屏幕,我把标准输出到一个文件来存储日志。 由于这个脚本长时间运行,我需要旋转日志文件,以便将它们放入更小的可pipe理的文件中。

我面临的问题是,一旦logrotate将当前的日志文件移动到新的日志文件,新创build的日志文件不再与日志填充。 看来,一旦原始日志文件被删除,其文件处理程序丢失,redirect将不再工作。

我也发现这个post和我有同样的问题,并声称可以通过使用>>而不是>来redirect输出。 我testing了他的解决scheme,但它不适合我。 有没有人有任何想法如何保持redirect工作?

您应该在logrotateconfiguration文件中使用copytruncate指令。

copytruncate在创build副本之后,原位截断原始日志文件,而不是移动旧的日志文件,并有select地创build一个新的日志文件。 当某些程序不能被告知closures它的日志文件时,它可以被使用,从而可以继续永久地写入(追加)到前一个日志文件。 请注意,复制文件和截断文件之间的时间片非常短,因此可能会丢失一些日志logging数据。 当使用此选项时,创build选项将不起作用,因为旧的日志文件保持原位

作为一种select,你也可以:

  • 在脚本中使用logging器工具而不是pipe道,并使用专用工具(例如local5),例如:

    logger -p local5.info -t myscriptname "this is some log data"

  • configuration系统日志写这个设施到想要的日志文件,例如(rsyslog.conf):

    local5.* /var/log/mylogfile

  • 为此日志设置logrotate规则。

Iain解决scheme的另一种替代方法是在旋转发生后使用postrotate脚本来重新启动您的脚本。 这是为大量的守护进程(重新启动或重新加载守护进程)完成的,但不知道你的脚本我不知道这个解决scheme是否适合你(你的脚本是否依赖于前一段时间生成的某种状态?)。

/etc/logrotate.d/your-script-name内容:

 /var/log/your-script-name.log { # your current logrotate options ... postrotate # this supposing you have the current pid stored cat /run/your-script-name.pid | xargs -r kill #relaunch it again /usr/local/bin/your-script-name endscript } 

你可以通过pipe道输出(stdout)来“分裂”(在linux中是coreutils的一部分)。 它允许你根据大小,行数等将文件/标准input分块。一旦你得到它分块,你可以用logrotatepipe理它,如果需要的话。