![轮换始终处于打开状态且正在写入的文件](https://linux22.com/image/605021/%E8%BD%AE%E6%8D%A2%E5%A7%8B%E7%BB%88%E5%A4%84%E4%BA%8E%E6%89%93%E5%BC%80%E7%8A%B6%E6%80%81%E4%B8%94%E6%AD%A3%E5%9C%A8%E5%86%99%E5%85%A5%E7%9A%84%E6%96%87%E4%BB%B6.png)
我有一个 Linux 应用程序,它会不断将日志信息写入日志文件,例如。/var/log/application.log
由于应用程序不会自动轮换文件,因此该日志文件在几周内可能会达到 GB 的大小,因此我希望能够正确轮换此文件
我主要关心的是,为了旋转应用程序始终打开的文件,我可能需要:
将文件移动到其旋转形式
/var/log/application.log -> /var/log/application.log.2013-01-28
创建一个空的
/var/log/application.log
。注意:目前申请流程仍在进行中/var/log/application.log.2013-01-28
更改应用程序进程的文件描述符,使其再次指向
/var/log/application.log
那么,我是对的吗?如果是这样,我该怎么做?(主要是更改文件描述符部分)
如果不是,那么正确的方法是什么以及该如何做?
答案1
编写一个logrotate
配置以供使用copytruncate
copytruncate
Truncate the original log file in place after creating a copy, instead of moving the
old log file and optionally creating a new one. It can be used when some program
cannot be told to close its logfile and thus might continue writing (appending) to
the previous log file forever. Note that there is a very small time slice between
copying the file and truncating it, so some logging data might be lost. When this
option is used, the create option will have no effect, as the old log file stays
in place.
答案2
大多数此类应用程序都会对信号(例如SIGHUP
)做出响应,并在收到信号后关闭并重新打开其日志文件。请查看应用程序的文档以了解要发送的正确信号。