在我的日志轮播设置中,对于特定日志文件,旋转已设置为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
}
答案 0 :(得分:0)
尽管设置了copytruncate
,但delaycompress
和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
是互斥的compress
和delaycompress
命令:您要删除旧文件,那么为什么还要首先进行压缩呢?但是,正如上面所指出的,看起来您不想首先使用日志,因此如果您真的不需要,请尝试阻止应用程序编写它们,或重定向到/dev/null
它们。
旁注:您对正在发生的事情的描述不太准确因为copytruncate
设置的:日志文件永远不会被删除,只会被复制,然后被截断到位。这用于无法更改要写入的文件句柄的程序。