c - 日志记录与 logrotate 兼容

标签 c linux logrotate

我正在编写一个写入日志的 Linux 守护进程。我希望日志由 logrotate 旋转。该程序是用 C 语言编写的。

通常,我的程序会在启动时打开日志文件,然后根据需要写入条目,最后在退出时关闭日志文件。

为了使用 logrotate 支持日志轮换,我需要做些什么不同的事情?据我所知,我的程序应该能够在每次 logrotate 完成其工作时重新打开日志文件。然而,我用谷歌搜索的来源并没有具体说明重新打开日志文件的确切含义。我需要对旧文件做些什么吗?我可以创建另一个同名文件吗?我更喜欢非常具体的说明,例如一些简单的示例代码。

我还了解到应该有一种方法可以告诉我的程序何时该重新打开。我的程序已经有一个 D-Bus 接口(interface),我想将它用于那些通知。

注意:我不需要有关如何配置 logrotate 的说明。这个问题只是关于如何使自己的软件与它兼容。

最佳答案

常用的有几种方式:

  1. 您使用 logrotate 并且您的程序应该能够捕获一个信号(通常是 SIGHUP)作为关闭和重新打开其日志文件的请求。然后 logrotate 在 postrotate 脚本中发送信号
  2. 您使用logrotate 并且您的程序不知道它,但可以重新启动。然后 logrotate 在 postrotate 脚本中重新启动您的程序。缺点:如果程序的启动成本很高,这可能不是最优的
  3. 您使用了 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...

  4. 您使用 rotatelogs,它是 httpd Apache 的实用程序。您的程序不是直接写入文件,而是将其日志通过管道传输到 rotatelogs。然后 rotatelogs 管理不同的日志文件。缺点:您的程序应该能够登录到管道,否则您将需要安装命名的 fifo。

但请注意,对于关键日志,在每条消息后关闭文件可能会很有趣,因为它可以确保在应用程序崩溃时所有内容都已到达磁盘。

关于c - 日志记录与 logrotate 兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53188731/

相关文章:

c++ - 动态调整组合框的宽度,以便显示整个字符串

c - 同名的两个函数 : One static How to declare in header file

linux shell 脚本 : getting filename from a user input string

linux - logrotate 说在旋转日志/重新创建日志文件时权限被拒绝

cron - ProFTPD被杀死(信号15)错误-如何修复logrotate重新启动错误?

c - 如何使用命令中的参数运行 execlp

c - 运行时库对操作系统的依赖性

Linux 二进制权限

linux - 如何将 acl 备份到文件然后将其应用到另一个文件夹?

ubuntu - logrotate: 打开 <log>.gz 时出错