【问题标题】:App writes to ".log.1" file instead of ".log" file after running logrotate应用程序在运行 logrotate 后写入“.log.1”文件而不是“.log”文件
【发布时间】:2014-04-07 06:46:05
【问题描述】:

在强制运行logrotate 后,我的应用程序一直写入my_app.log.1(应该稍后存档的旧日志)而不是my_app.log

这使my_app.log 成为一个空文件,因此logrotate 运行时没有任何影响。 my_app.log.1 不断增长到千兆字节。

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

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

我知道我把notifempty 放在那里,但为什么首先要写入my_app.log.1

【问题讨论】:

  • 如果应用程序在运行时保持日志文件打开,它不受文件名更改的影响。它继续写入文件。 logrotate 可以配置(在postrotate 脚本中)以在重命名文件后重新启动应用程序(或发送HUP 信号,如果应用程序响应它)。文档中有示例。

标签: ubuntu logging logrotate


【解决方案1】:

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

这是因为 pm2 正在写入日志文件。 logrotate 改名为my_app.log.1 并创建了新的my_app.log 文件,但pm2 并不在意,一直写信给my_app.log.1

我通过将notifempty 选项替换为copytruncate 解决了这个问题,然后重新启动了pm2。修复后,notifempty 可以加回来,但我真的不需要。

请参阅logrotate reference 了解更多信息。希望这会帮助其他人遇到类似的问题。

【讨论】:

  • copytruncate 有一个小问题。在复制和截断文件时,会丢失一些数据。你如何解决这个问题?
  • 我认为更好的解决方案是使用 postrotate 脚本重新启动 pm2 进程,但会增加额外的复杂性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 2016-09-15
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多