Ubuntu 应用程序写入到";。日志1“;文件而不是";。日志“;运行logrotate后的文件

Ubuntu 应用程序写入到";。日志1“;文件而不是";。日志“;运行logrotate后的文件,ubuntu,logging,logrotate,Ubuntu,Logging,Logrotate,强制运行logrotate后,我的应用程序将继续写入my_app.log.1(以后应存档的旧日志),而不是my_app.log 这使得my_app.log成为一个空文件,因此logrotate运行时没有任何效果。而my_app.log.1的容量将持续增长到千兆字节 我正在运行Ubuntu 12.04。我的应用程序是一个使用Node.js的应用程序。以下是我的logrotate配置: "/var/log/my_app/*.log" { daily size 50M rotate 10

强制运行
logrotate
后,我的应用程序将继续写入
my_app.log.1
(以后应存档的旧日志),而不是
my_app.log

这使得
my_app.log
成为一个空文件,因此
logrotate
运行时没有任何效果。而
my_app.log.1
的容量将持续增长到千兆字节

我正在运行Ubuntu 12.04。我的应用程序是一个使用Node.js的应用程序。以下是我的logrotate配置:

"/var/log/my_app/*.log" {
  daily
  size 50M
  rotate 10
  missingok
  compress
  delaycompress
  notifempty
}

我知道我把notifempty放在那里了,但是为什么我的app.log.1首先要写在那里呢?

我终于想出了解决问题的办法

这是因为日志文件是由
pm2
编写的
logrotate
将其名称更改为
my_app.log.1
并创建了新的
my_app.log
文件,但
pm2
对此并不在意,一直在向
my_app.log.1
写入

我用
copyruncate
替换了
notifempty
选项,然后重新启动了
pm2
,解决了这个问题。修复后,
notifempty
可以添加回来,但我并不真正需要它


有关更多信息,请参阅。希望这能帮助其他人解决类似问题。

如果应用程序在运行时保持日志文件打开,则不会受到文件名更改的影响。它继续在文件中写入
logrotate
可以配置(在
postrotate
脚本中)在重命名文件后重新启动应用程序(或者发送
HUP
信号,如果应用程序响应)。文档中有一些示例。copytruncate有一个小问题。复制和截断文件时,会丢失一些数据。如何解决这个问题?我认为更好的解决方案是使用postrotate脚本重新启动pm2进程,但会增加额外的复杂性。