我必须在 Windows 下用 C++ 实现线程安全的日志记录机制,并且我想使用流库。
我想知道是否有人可以就这样做给我一些建议,最好的方法是什么?
日志消息每次很可能有几行长,所以我可能需要先将它们写入缓冲区然后刷新到文件?
此日志记录应该相当快,并且在使用时不会过多影响应用程序的性能,因此我正在考虑在其自己的线程中实际写入文件。这是一个好主意吗?
任何建议和提示表示赞赏。
我必须在 Windows 下用 C++ 实现线程安全的日志记录机制,并且我想使用流库。
我想知道是否有人可以就这样做给我一些建议,最好的方法是什么?
日志消息每次很可能有几行长,所以我可能需要先将它们写入缓冲区然后刷新到文件?
此日志记录应该相当快,并且在使用时不会过多影响应用程序的性能,因此我正在考虑在其自己的线程中实际写入文件。这是一个好主意吗?
任何建议和提示表示赞赏。
是的 - 首先写入临时 std::ostringstream 对象,然后将其刷新到日志 ofstream。这不仅仅是为了避免持有锁太久,而是为了让来自不同线程的流操纵器不会相互影响,并且让各个调用operator<<
不会将它们的输出散布在日志中。临时 ostringstream 让您可以处理完整的、有意义的、多行消息,并确保将它们写成一个整体。
在你分析它并查看它是否是一个问题之前,我不会打扰一个专用线程。简单就好。
(一个常见的性能错误:在决定日志级别是否需要记录该消息之前,将日志消息流式传输到对象中。为避免这种情况,请使用预处理器宏将 if 包装在流式周围。)
在 Mitch 建议检查框架的旁边:
流式传输到缓冲区并将缓冲区发送到线程是一种现实的方法。如果您进行条件日志记录(基于严重性级别),宏可以帮助避免在不需要时进行流式传输(它们还可以帮助处理元数据:文件、行、函数)。
请记住,如果您也将它们记录在单独的线程中,那么在崩溃时会丢失关键日志记录。
一种选择是将您的日志记录代码放在一个单独的应用程序或带有隐藏窗口的线程中,并使用 PostMessage 发送您的日志记录数据。