使用流进行Threadsafe日志记录

时间:2010-09-07 09:51:52

标签: c++ multithreading error-logging

我必须在Windows下用C ++实现线程安全日志记录机制,我想使用流库。

我想知道是否有人可以就这样做以及最好的方式给我一些建议?

每次记录消息很可能会长几行,所以我可能需要先将它们写入缓冲区然后刷新到文件中?

这个日志记录应该相当快,并且在使用它时不会过多地影响应用程序的性能,所以我在考虑在自己的线程中对文件进行实际写入。这是个好主意吗?

任何建议和提示都表示赞赏。

4 个答案:

答案 0 :(得分:4)

不是自己编写,为什么不使用现有的:

pantheios

Boost

答案 1 :(得分:2)

是 - 首先写入临时std :: ostringstream对象,然后将其刷新到日志流。这不仅仅是为了避免长时间保持锁定,而是来自不同线程的流操纵器不会相互影响,因此对operator<<的单独调用不会将其输出散布在日志中。临时ostringstream允许您处理完整,有意义的多行消息,并确保它们是一体编写的。

在你对它进行分析并看到它是一个问题之前,我不会打扰专用线程。简单就是好。

(一个常见的性能错误:在决定日志记录级别是否需要记录消息之前将日志消息流式传输到对象中。为避免这种情况,请使用预处理器宏来包装流式传输。)

答案 2 :(得分:0)

接下来,米奇建议检查框架:
流式传输到缓冲区并将缓冲区发送到线程是一种现实的方法。 如果您进行条件记录(基于严重性级别),宏可以帮助避免在不需要时进行流式处理(它们也可以帮助处理元数据:文件,行,功能)。
请记住,如果您在单独的线程中记录它们,那么崩溃时将会丢失关键日志记录。

答案 3 :(得分:0)

一种选择是将您的日志记录代码放在一个带有隐藏窗口的单独应用程序或线程中,并使用PostMessage发送您的日志记录数据。