logrotate移动后如何继续将stdout重定向到文件?

Meh*_*ran 22 linux redirect logrotate

我有一个简单的脚本,它输出一堆日志到屏幕上,我将 STDOUT 通过管道传输到一个文件来存储日志。由于这个脚本运行时间很长,我需要轮换日志文件,以便将它们放入更小的更易于管理的文件中。

我面临的问题是,一旦logrotate将当前日志文件移动到一个新文件中,新创建的日志文件就不再填充日志了。似乎一旦原始日志文件被删除,它的文件处理程序就会丢失并且重定向将不再起作用。

我还发现这篇文章与我有同样的问题,并声称可以通过使用>>而不是>重定向输出来修复它。我测试了他的解决方案,但对我不起作用。有谁知道如何保持重定向工作?

use*_*517 25

您应该在日志文件的 logrotate 配置中使用 copytruncate 指令。

copytruncate 在创建副本后原地截断原始日志文件,而不是移动旧日志文件并可选择创建新日志文件。当某些程序无法被告知关闭其日志文件并因此可能永远继续写入(附加)到前一个日志文件时,可以使用它。请注意,复制文件和截断文件之间的时间片非常短,因此可能会丢失一些日志记录数据。使用此选项时,创建选项将无效,因为旧日志文件保留在原位

  • 可能值得一提的是:短时间内,在`compress`操作之前,数据被复制。这曾经给我们带来了一个问题,但那是我们的坏处,因为我们不应该那么接近 `lv` 空间限制。此外,如 `man` 片段中所述,您可能会在复制和截断操作之间丢失一些日志数据。 (2认同)

ton*_*ioc 6

作为替代方案,您还可以:

  • 在脚本中使用 logger 实用程序而不是管道,并使用专用工具(例如 local5),例如:

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

  • 配置 syslog 以将此工具写入想要的日志文件,例如 (rsyslog.conf):

    local5.* /var/log/mylogfile

  • 为此日志设置 logrotate 规则。