如何在没有 logrotate 的情况下在打开/实时文件时手动轮换日志?

如何在没有 logrotate 的情况下在打开/实时文件时手动轮换日志?

我的 Google-Fu 让我非常接近了,但还是没有完全达到,而且我想我对 Linux 还太陌生,无法把这些部分整合在一起。

我有一个非常大的 >200GB 日志文件,仍在写入。Logrotate 无法及时处理它,否则磁盘空间可能会成为问题。另外,我不想再启动一轮logrotate,因为我不想影响其配置中的所有其他目标。我已在文件中添加了新的节,logrotate.conf如下所示:

/log/myDevice/myDevice.log {
  compress
  daily
  rotate 360
  maxage 360
  missingok
  compresscmd /usr/bin/xz
  dateext
  compressext .xz
  copytruncate
  olddir /log/archive/myDevice
}

我想手动做这些事情:

  1. copytruncate :抓取当前日志文件,但允许 syslog-ng 继续处理当前打开/活动文件
  2. (不在上述 logrotate.conf 中) split:将当前日志卷分解成更小的块
  3. xz:压缩到存档文件夹

我可以,split(1)而且xz(1)很好,但是当我尝试抓取目标文件时,却没有成功。

我尝试过sudo mv myDevice.log ZmyDevice.log && touch myDevice.log,但是 syslog-ng 只是带着原始文件(和它的新名称)移动并且继续愉快地写入。当我思考 syslog-ng 如何引用该文件时,我感到有点意外。

因此,我试图弄清楚如何做某种手册copytruncate,以便将文件剪切到另一个“就地”的文件,并让 syslog-ng 继续执行它想要的内容。

答案1

移动文件,然后向 syslog-ng 进程发送 SIGHUP:

终止-HUP

这将导致它重新打开所有打开的文件,从而释放您刚刚移动/重命名的文件并允许您继续。然后它将重新打开 /log/myDevice/myDevice.log 并开始写入。

答案2

查找哪些进程打开了文件:fuser /path/to/file。然后使用kill -SIGSTOP暂停正在写入文件的进程。然后旋转文件、复制文件、截断文件,无论您需要做什么,然后使用 恢复进程kill -SIGCONT

相关内容