C语言中多线程的高效日志记录解决方案

Sla*_*ish 2 c linux logging

我有一个C程序,它有多个工作线程.有一个主线程周期性地(每0.2秒)进行一些基本检查(即线程完成,接收到信号等).在每次检查时,我想将日志文件中任何线程在其日志缓冲区中可能包含的任何数据写入日志文件中.

我最初的想法是简单地打开日志文件,从所有线程写入数据然后再次关闭它.我担心这可能是一个过多的开销,因为这些检查每0.2秒发生一次.

所以我的问题是 - 这种情况效率低下吗?

如果是这样,有人可以建议更好的解决方案?

我想让文件描述符保持打开状态,只是在每次检查时写入新数据,但是如果物理文件以某种方式被删除,程序将永远不会知道(没有重新检查,在这种情况下我们也可能只是打开)该文件再次)和记录数据将丢失.

(此程序设计为运行很长一段时间,因此日志文件将在某些时候删除的事实基本上由于日志轮换而得到保证.)

Joh*_*ica 5

我想让文件描述符保持打开状态,只是在每次检查时写入新数据,但是如果物理文件以某种方式被删除,程序将永远不会知道(没有重新检查,在这种情况下我们也可能只是打开)该文件再次)和记录数据将丢失.

UNIX上的标准解决方案是为SIGHUP添加一个信号处理程序,它关闭并重新打开日志文件.许多 UNIX守护程序正是为了这个目的而这样做,以支持日志轮换.调用kill -HUP <pid>日志轮换脚本,你就可以开始了.

(某些程序还会将SIGHUP视为重新读取其配置文件的提示,因此您可以动态进行配置更改,而无需重新启动进程.)