3

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

根据文档,当旋转设置为 0 时应该删除该文件。为什么会这样?我还必须说日志轮换配置为每小时运行一次,但我们的日志文件在 1 小时内达到大小。因此,当 logrotate 每小时运行一次时,它会删除old application.log.1,滚动当前application.logapplication.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
}
4

1 回答 1

1

尽管进行了设置,但它看起来像两者copytruncatedelaycompress导致创建新文件。rotate 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:日志文件永远不会被删除,只会被复制,然后被截断这用于无法更改它们正在写入的文件句柄的程序。

于 2017-11-14T14:37:54.783 回答