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

use*_*257 5 c++ logging boost real-time pantheios

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

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

我相信两个日志记录平台都可以做到这一点,但我不清楚他们快速浏览一下他们的API.任何使用过这些日志记录工具的人都可以给我一些关于它们在这种情况下的效率,实现我描述的容易程度,或者它们在两个日志记录框架之间的偏好的反馈吗?真的任何信息都会有用.

谢谢

Cas*_*Cow 6

我已经完成了大型多线程情况的登录.我的经历是:

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

  • 解耦日志消息的生成以及它们的记录方式.

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

  • 每个用例都应该生成一个特殊的id,该id保留在该用例中,从中记录的所有内容都将显示此用例id.

  • 还要记录生成消息的thread-id.

  • 使用单独的线程进行日志记录而不是生成消息的线程.(boost的日志库就是这样做的)

  • 谨防"宏观疯狂",虽然光自动添加像FILELINE这样的东西是可以的.


Ton*_*ion 2

我正在使用 Jon Torjo 编写的 Boost 日志记录库,该库提供从专用线程对日志文件进行所有写入操作,因此在执行日志记录的线程上不会出现 I/O 延迟。这样做的缺点是,当系统崩溃时,某些日志语句可能不会被记录,因为它使用了内部队列。

但总的来说,这个库表现得很好,为您提供了很多不同的选择,如果您愿意在消息上做出牺牲,我认为这对您来说可能是一个不错的选择。

如果这不是一个选项,您将不得不从需要记录的线程执行 I/O,这在实时系统上确实不理想。

如果您在 Windows 上运行,您知道它不是 RT 操作系统,对吧?