假设在多线程环境中调用函数时我只记录1个整数,那么实现这种机制的最佳设计是什么?例如:
void foo1 () {
log(1);
...
}
void foo2 () {
log(2);
...
}
以下是可能的方法:
fprintf()
登录文件即可。的问题:
打电话是不是一项昂贵的操作
函数只记录1整数?如果我错了,请纠正我。有关高效日志记录机制的更多建议吗?
答案 0 :(得分:2)
嗯,“简单”的日志记录不是。 fprintf
将跳转到内核(上下文切换),然后返回程序(也是上下文切换)。不快,如果速度是你需要的。您可能还需要一个非常非常昂贵的sync()
来确保日志数据实际上在发生电源故障时才能进入磁盘。你真的不想去那里:)
我会说缓冲方法实际上是速度和可靠性之间最快和最合理的权衡。我要做的是让缓冲区同步,以便由多个线程安全地写入。同时我会运行一个磁盘写入器线程,它会偶尔将数据刷新到磁盘(很大程度上取决于你拥有的数据类型)。我会使用非常基本的语言功能,更多地进入plain C
领域,只是因为某些功能(异常处理,多重继承......)在特殊情况下太容易破解。
你可能不知道的一件事是程序在崩溃时确实有发言权。您可以订阅程序查杀signals(某些信号可以被程序取消,但是杀死信号不是其中之一)。在进行信号处理时,可以最后一次刷新日志缓冲区并保存更多数据。还有atexit()
。
答案 1 :(得分:0)
你可以看看像boost日志这样的日志库,或者看看用互斥体包装std :: cout,cerr,cin(或者你记录的文件),因为有缓冲然后它不应该不断写入少量文件。