什么是最有效的线程安全C ++记录器?

时间:2009-01-13 16:54:41

标签: c++ logging

我正在开发一个性能关键的多线程应用程序。我查看了rlog,Ace和Boost日志记录。我之所以选择rlog是因为我认为它是最快的(当禁用日志时,它的开销最小)。

我遇到的问题是它显示文件名,行号等,即使在发布模式下也是如此。如果你能告诉我如何关闭这些信息,我的问题可能会得到解决。在任何情况下,对于我的情况,C ++中最有效的记录器是什么?

9 个答案:

答案 0 :(得分:32)

不幸的是,我目前无法投票。据我所知,从来没有像Apache log4cxx那样使用垃圾。它包含严重的错误。

  1. 0.9分支的最后一个版本是0.9.7并且仍然包含内存泄漏,因为每个具有虚拟成员的类都没有虚拟dtor。
  2. 最新版本0.10.x从0.9.x中丢失了许多功能,并且不向后兼容。你被迫重写了很多自己的代码。
  3. 整个项目似乎没有维护。 0.11.xx的发布已经公布了2年。
  4. 在我看来,你应该选择加强。

答案 1 :(得分:19)

Pantheios被认为是最好的performing C++ logging library,并声称是唯一100%类型安全的(请参阅this article有关相关库解释为什么是printf ()/基于iostream的库不是类型安全的)

答案 2 :(得分:10)

我在http://logging.apache.org/log4cxx/index.html处使用log4cxx取得了成功。它是流行的Log4j记录器的C ++版本,可以通过conf文件或代码轻松配置。禁用它时的开销很小(方法调用和整数比较)。

输出到日志的模式由转换模式定义,转换模式可以像日期/时间和消息一样简单。它还处理文件大小限制,翻转等。您还可以为各种错误和来源配置不同的模式。

答案 3 :(得分:9)

以下是关闭rlog提供的额外信息(如文件名,行号等)的方法。在main()函数(或任何内容)中初始化rlog时,您可能会执行以下操作:

rlog::RLogInit(argc, argv);
rlog::StdioNode slog (2, rlog::StdioNode::OutputColor);
slog.subscribeTo( RLOG_CHANNEL("error") );

StdioNode的第二个参数是用于控制输出的标志。检查rlog文档(可以使用Doxygen生成)以获取可能的标志列表。 此处示例中的一个使rlog仅根据严重性对输出着色,而不添加任何其他信息。

答案 4 :(得分:8)

您可能希望考虑使用logog系统。 logog提供了这种功能,但它没有Pantheios所具有的隐式代码依赖性。 logog是线程安全的,它允许对任何点上记录的消息类型进行高度控制。

我是logog的作者和维护者,所以我的观点有点偏颇。但在实施这个系统之前,我确实检查了rlog,Pantheios和其他日志记录系统。

https://github.com/johnwbyrd/logog

答案 5 :(得分:4)

您的宏/流中可能会发生一些开销。在禁用日志记录时,您需要非常小心不要编写正在记录的字符串。

聪明地使用流和?:运算符允许你这样做,就像宏一样。

答案 6 :(得分:2)

也许pantheios
虽然我不知道它是否是线程安全的......

答案 7 :(得分:2)

Poco有很好的日志记录支持......

http://pocoproject.org/slides/110-Logging.pdf

答案 8 :(得分:2)

试用c-log lib,https://github.com/0xmalloc/c-log,一个用于C / C ++语言的快速,稳定且线程安全的日志库。