c++ - c++ 日志库异步捕获高吞吐量数据的可行性?

标签 c++ logging boost real-time pantheios

我正在使用用 C++ 编写的实时系统。我们希望使用 boost 或 pantheios 进行日志记录。该系统有一些标准的日志记录要求,我相信任何一个框架都可以满足这些要求,但除此之外,我们还希望能够记录该系统捕获的所有输入。此输入将由多个线程捕获,包括一些具有实时约束且无法承受因低效日志记录而造成的重大延迟的线程。这应该会导致记录数据的高吞吐量。

我主要想知道是否可以信任任何一个框架来管理来自多个线程的如此高吞吐量的日志记录,而不会延迟我的时间关键线程。此外,我们可能需要进行一些数据清理,这需要添加某种钩子(Hook),该钩子(Hook)能够识别具有安全数据的捕获输入,运行我们的数据清理钩子(Hook),并维护一个包含已清理值映射的缓冲区。

我相信这两个日志记录平台都可以做到这一点,但快速浏览一下它们的 API 对我来说并不清楚。任何使用过这些日志记录工具的人都可以给我一些反馈,说明它们在这种情况下的效率如何、实现我所描述的内容有多容易,或者他们对这两个日志框架的偏好吗?真的,任何信息都会有用。

谢谢

最佳答案

我已经完成了大型多线程情况下的日志记录。我的经验是:

  • 日志记录仅供开发人员使用。没有其他人会阅读或理解日志文件。

  • 解耦日志消息的生成及其记录方式。

  • 如果您想更有效地生成日志消息,请首先使用快速的上下文,检查是否有任何内容正在记录此上下文,如果没有,则不要生成。否则生成消息。 (此技术最常见的用途是“级别”,可以是“调试”、“信息”等,如果没有任何日志记录到该级别,我们就不会创建消息)。

  • 每个用例都应生成一个特殊 ID,该 ID 与该用例一起保留,并且从中记录的所有内容都将显示此用例 ID。

  • 同时记录生成消息的线程 ID。

  • 使用与生成消息的线程不同的线程进行日志记录。 (boost 的日志库就是这样做的)

  • 虽然自动添加FILELINE 之类的轻型宏是可以的,但要小心“宏疯狂”。

关于c++ - c++ 日志库异步捕获高吞吐量数据的可行性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5042280/

相关文章:

c++ - WinDivert - 修改数据包数据/负载内容

c++ - 当类是更大框架的一部分时,析构函数是否应该始终是虚拟的?

java - log4j INFO 级别不记录信息

c++ - 将 boost::bind 与构造函数一起使用

C++ 共享库 undefined reference `FooClass::SayHello()'

c++ - C++中如何将函数作为参数传递?

c++ - boost 图列表或 vec

c++ - 通过仿函数断开 boost 信号 2 连接

java - 将 Log4J 2.X 事件发送到 Log4J 1.X

Java Logger : Create file with rotation number + . 日志作为后缀