什么是最高效的线程安全的C ++logging器?
我正在研究性能关键的multithreading应用程序。 我看着rlog,Ace和Boostlogging。 我select了rlog,因为我读的是最快的(当日志被禁用时,它的开销最小)。
我的问题是它显示文件名,行号等,即使在发布模式。 如果你能告诉我如何closures这些信息,我的问题可能会得到解决。 无论如何,在我的情况下,C ++中最有效的logging器是什么?
不幸的是我现在还不能投票。 据我所说永远不会像Apache log4cxx一样使用废话。 它包含严重的错误。
- 0.9分支的最后一个版本是0.9.7,并且仍然包含内存泄漏,因为每个具有虚拟成员的类都没有虚拟分支。
- 最新版本0.10.x在0.9.x版本中损失了很多function,并且不能向后兼容。 你不得不重写很多你自己的代码。
- 整个项目似乎没有维护。 已经公布了0.11.xx的发布时间为2年。
在我看来,你应该加强。
Pantheios被认为是性能最好的C ++日志logging库 ,并声称是唯一一个100%types安全的(请参阅本文有关相关库的解释为什么基于printf()/ iostream的库不是type-安全)
我已经在http://logging.apache.org/log4cxx/index.html使用了log4cxx。; 它是stream行的Log4jlogging器的C ++版本,可以通过conf文件或代码轻松configuration。 禁用时的开销最小(方法调用和整数比较)。
输出到日志的模式由转换模式定义,转换模式可以像date/时间和消息一样简单。 它还处理文件大小限制,翻转等。您还可以为各种错误和来源configuration不同的模式。
以下是如何closuresrlog提供的额外信息(如文件名,行号等)。 当你在你的main()
函数中初始化rlog时,你可以执行以下操作:
rlog::RLogInit(argc, argv); rlog::StdioNode slog (2, rlog::StdioNode::OutputColor); slog.subscribeTo( RLOG_CHANNEL("error") );
StdioNode
的第二个参数是标志来控制输出。 检查rlog文档(可以使用Doxygen生成),查看可能标志的整个列表。 在这个例子中,rlog只会根据严重程度对输出进行着色,而不会添加任何其他信息。
你不妨考虑一下logog系统。 logog提供了这种types的function,但是它没有Pantheios所具有的隐式代码依赖性。 logog是线程安全的,它允许高度的控制什么types的消息logging在任何点。
我是logog的作者和维护者,所以我的意见有点偏颇。 但是在实施这个之前,我曾经审查过rlog,Pantheios和其他日志系统。
一些开销可能发生在你的macros/stream中。 在禁用日志logging时,您必须非常小心,不要编写正在logging的string。
聪明的使用stream和?:操作符可以让你这样做,就像macros一样。
也许pantheios
虽然我不知道它是否线程安全或不…
波科有很好的日志支持…
尝试一下c-log lib, https://github.com/0xmalloc/c-log ,一个用于C / C ++语言的快速,稳定和线程安全的日志库。