旋转一直打开并正在写入的文件


10

我有一个Linux应用程序,该应用程序不断将日志记录信息写入日志文件,例如。/var/log/application.log。由于应用程序不会自动旋转文件,因此该日志文件可能在几周内达到GB的大小,因此我希望能够正确旋转该文件

我这里主要关心的是,要旋转一个由应用程序始终打开的文件,我可能需要:

  1. 将文件移动到旋转形式 /var/log/application.log -> /var/log/application.log.2013-01-28

  2. 创建一个空的/var/log/application.logObs:至此,应用程序过程仍在写入/var/log/application.log.2013-01-28

  3. 更改应用程序进程的文件描述符以再次指向 /var/log/application.log

所以,对吗?如果是这样,我该怎么做?(主要是更改文件描述符部分)

如果我不是,正确的方法是什么,怎么做?


您需要清除文件还是仅旋转文件?
ewwhite

什么应用?该应用程序必须提供支持才能正确执行此操作。(否则,您可能会遇到一个非常丑陋的事情-附加到进程中,打开新文件,dup2在旧文件上添加新的描述符,然后关闭新描述符。)
David Schwartz 2013年

有趣的方式Schwartz。我很好奇看到它在行动,并且会玩一会儿。无论如何,该应用程序都在内部,并且我正在寻找更通用的解决方案。我喜欢kormoc的回答,顺便说一句
Bruno Polaco 2013年

@ewwhite我需要旋转它,我承受不起丢失日志数据的原因
Bruno Polaco 2013年

Answers:


11

编写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.

有趣的是,即使有数据丢失余量,在复制文件后将其截断也很聪明。我没有在logrotate上注意到此选项。感谢您的见解:)
Bruno Polaco 2013年

1

大多数此类应用程序都会响应信号,例如SIGHUP,并在收到信号后关闭并重新打开其日志文件。检查应用程序的文档以获取正确的信号发送。


如果没有,您可以重新启动应用程序作为后备。这就是syslog通常执行的工作,还有许多其他程序。
lsd
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.