我正在编写一个写入日志的 Linux 守护进程。我希望日志由 logrotate 旋转。该程序是用 C 语言编写的。
通常,我的程序会在启动时打开日志文件,然后根据需要写入条目,最后在退出时关闭日志文件。
为了使用 logrotate 支持日志轮换,我需要做些什么不同的事情?据我所知,我的程序应该能够在每次 logrotate 完成其工作时重新打开日志文件。然而,我用谷歌搜索的来源并没有具体说明重新打开日志文件的确切含义。我需要对旧文件做些什么吗?我可以创建另一个同名文件吗?我更喜欢非常具体的说明,例如一些简单的示例代码。
我还了解到应该有一种方法可以告诉我的程序何时该重新打开。我的程序已经有一个 D-Bus 接口(interface),我想将它用于那些通知。
注意:我不需要有关如何配置 logrotate 的说明。这个问题只是关于如何使自己的软件与它兼容。
最佳答案
常用的有几种方式:
- 您使用
logrotate
并且您的程序应该能够捕获一个信号(通常是 SIGHUP)作为关闭和重新打开其日志文件的请求。然后logrotate
在 postrotate 脚本中发送信号 - 您使用
logrotate
并且您的程序不知道它,但可以重新启动。然后logrotate
在 postrotate 脚本中重新启动您的程序。缺点:如果程序的启动成本很高,这可能不是最优的 您使用了
logrotate
而您的程序并不知道它,但是您将 copytruncate 选项传递给了logrotate
。然后logrotate
复制文件然后截断它。缺点:在竞争条件下,您可能会丢失消息。来自rotatelog.conf
联机帮助页... Note that there is a very small time slice between copying the file and truncating it, so some logging data might be lost...
您使用
rotatelogs
,它是 httpd Apache 的实用程序。您的程序不是直接写入文件,而是将其日志通过管道传输到rotatelogs
。然后rotatelogs
管理不同的日志文件。缺点:您的程序应该能够登录到管道,否则您将需要安装命名的 fifo。
但请注意,对于关键日志,在每条消息后关闭文件可能会很有趣,因为它可以确保在应用程序崩溃时所有内容都已到达磁盘。
关于c - 日志记录与 logrotate 兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53188731/