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


85

我正在研究性能至关重要的多线程应用程序。我查看了rlog,Ace和Boost日志记录。我选择rlog是因为我读到它是最快的(禁用日志记录后,其开销最少)。

我的问题是即使在发布模式下,它也会显示文件名,行号等。如果您可以告诉我如何关闭该信息,则可能会解决我的问题。在任何情况下,对于我来说,最有效的C ++记录器是什么?


23
我很快得出结论,助推器具有一切。即使没有,当您再次查看时它也会出现!
马丁·贝克特

20
我不明白为什么关闭了它。他问了一个具体且可衡量的问题。如果我们忽略使用什么编译器,那么只能有一个“最有效的线程安全C ++记录器”。StackOverflow的这几天....
JohnJohn


Answers:


35

不幸的是,目前我无法投反对票。据我所知,永远不要使用像Apache log4cxx这样的废话。它包含严重的错误。

  1. 0.9分支的最新版本是0.9.7,并且仍然包含内存泄漏,因为每个具有虚拟成员的类都没有虚拟dtor。
  2. 最新的0.10.x版本从0.9.x版本开始失去了很多功能,并且不向后兼容。您不得不重写很多自己的代码。
  3. 整个项目似乎无法维护。0.11.xx的发布已经发布了两年。

我认为您应该继续努力。


10
“每个有虚拟成员的班级都没有虚拟dtor”不相信它,不得不对其进行检查。相当令人失望的Apache。
ManuelSchneid3r 2015年

6
您现在可以投票:)
Fund Monica的诉讼

5
>>“每个具有虚拟成员的类都没有虚拟dtor”虽然这不是很好,但这并不意味着它会引起问题。如果通过动态而不是静态类型删除类,这只是一个问题。本身,这本身不是问题,并不意味着任何内存泄漏。
evilrix

1
@evilrix类具有虚拟成员,但没有虚拟dtor。这些类没有受保护的/私有的新操作员。实际上,这是一个非常糟糕的代码,不应该被释放。那你有什么意思呢?
kirsche40

@ kirsche40我认为我的观点很清楚。您对标准措辞的哪一点解释不明白?请允许我重新表达一下:如果您尝试通过基类指针删除,这是一个问题。在这种情况下,如果析构函数不是虚拟的,则行为是不确定的。在这一点上,该标准非常明确。我敢肯定,我所说的都没有暗示我要提倡OP将其用作实现。
evilrix

19

Pantheios被认为是性能最好的C ++日志记录库,并且声称是唯一一个100%类型安全的库(有关此库的信息,请参阅此文章,解释为什么基于printf()/ iostream的库不是类型库-安全)


4
即使他们不喜欢Pantheios,在您链接的页面上的“竞争对手”列表也会提供有用的信息。
2011年

10

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

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


9

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

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

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


9

您可能希望考虑使用徽标系统。logog恰好提供了这种功能,但没有Pantheios具有的隐式代码依赖性。logog是线程安全的,它可以随时控制在什么类型的消息上进行记录。

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

https://github.com/johnwbyrd/logog


更新了链接,谢谢您的注释。
johnwbyrd

4

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

与宏一样,巧妙地使用流和?:运算符可以使您做到这一点。




2

尝试使用c-log库https://github.com/0xmalloc/c-log,这是一种针对C / C ++语言的快速,稳定且线程安全的日志库。


8
不幸的是,c-log在GPL之下,这意味着您不能将其与非GPL兼容(例如专有商业)软件一起使用。这使得它对许多用户不可用。
克里斯

现在github.com/0xmalloc/c-log中没有许可证。 商业和个人免费使用。
2014年

2
您是c-log的作者吗?如果是这样,我强烈建议您(在Github页面上,在自述文件和源代码中的注释中)明确声明软件的发布许可证。即使它是公共领域(我不建议这样做),也应明确声明。话虽如此,有许多“商业友好”(即允许的)开源许可证可供选择-最受欢迎的是Apache,BSD或MIT。
克里斯

仅Linux?(#include <pthread.h>...)
rustyx
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.