即使旋转后Logrotate也不旋转旧文件设置为0

时间:2017-11-14 13:47:41

标签: logrotate log-rotation

在我的日志轮播设置中,对于特定日志文件,旋转已设置为0.但是一旦达到文件大小,旧文件就会旋转到application.log.1而不是被删除。

根据文档,当rotate设置为0时,应删除该文件。为什么会发生这种情况?我还必须说日志旋转配置为每小时运行一次,但我们的日志文件在1小时内达到大小。因此,当logrotate每小时运行一次时,它会删除old application.log.1,将当前application.log滚动到application.log.1并创建一个新的application.log文件。 该文件的配置如下所示:

/var/log/application.log
{
    rotate 0
    weekly
    size 256M
    missingok
    notifempty
    copytruncate
    compress
    delaycompress
    sharedscripts
    postrotate
            reload rsyslog >/dev/null 2>&1 || true
            /usr/sbin/scalyr-agent-2 stop
            /usr/sbin/scalyr-agent-2 start
    endscript
}

1 个答案:

答案 0 :(得分:0)

尽管设置了copytruncate,但delaycompressrotate 0似乎都会导致创建新文件。由于您想立即删除旧文件(为什么不直接首先登录/dev/null?),您无论如何都不需要任何compress设置。

我看到两个选项:

  • 如果您确实需要copytruncate,请添加postrotate命令以删除创建的文件:

    /var/log/application.log {
        rotate 0
        size 256M
        missingok
        notifempty
        copytruncate
        postrotate
            reload rsyslog >/dev/null 2>&1 || true
            /usr/sbin/scalyr-agent-2 stop
            /usr/sbin/scalyr-agent-2 start
            rm -f /var/log/application.log.1
        endscript
    }
    
  • 如果您不需要copytruncate,请将其替换为create(如果有的话,您的服务可能会自行创建新的日志文件):

    /var/log/application.log {
        rotate 0
        size 256M
        missingok
        notifempty
        create
        postrotate
            reload rsyslog >/dev/null 2>&1 || true
            /usr/sbin/scalyr-agent-2 stop
            /usr/sbin/scalyr-agent-2 start
        endscript
    }
    

    根据需要向create命令添加所有者和权限。

我也做了以下事情:

  • 删除weekly:频率和size是互斥的
  • 删除compressdelaycompress命令:您要删除旧文件,那么为什么还要首先进行压缩呢?

但是,正如上面所指出的,看起来您不想首先使用日志,因此如果您真的不需要,请尝试阻止应用程序编写它们,或重定向到/dev/null它们。

旁注:您对正在发生的事情的描述不太准确因为copytruncate设置的:日志文件永远不会被删除,只会被复制,然后被截断到位。这用于无法更改要写入的文件句柄的程序。