【问题标题】:What is the most efficient thread-safe C++ logger? [closed]什么是最有效的线程安全 C++ 记录器? [关闭]
【发布时间】:2010-10-01 04:29:02
【问题描述】:

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

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

【问题讨论】:

  • 我很快得出结论,boost 拥有一切。即使没有,当你再看时它也会出现!
  • 我不明白为什么它被关闭了。他提出了一个具体且可衡量的问题。如果我们忽略正在使用的编译器,可能只有一个“最高效的线程安全 C++ 记录器”。这些天 Stackoverflow....

标签: c++ logging


【解决方案1】:

很遗憾,我目前无法投反对票。据我所知,永远不要使用像 Apache log4cxx 这样的垃圾。它包含严重的错误。

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

在我看来,你应该使用 boost。

【讨论】:

  • “每个有虚拟成员的班级都没有虚拟dtor”不相信,不得不检查它。非常令人失望的 Apache。
  • 你现在可以投反对票了 :)
  • >> "每个具有虚拟成员的类都没有虚拟 dtor" 虽然这不是很好,但这并不意味着它会导致问题。如果类被动态而不是静态类型删除,这只是一个问题。仅此一项本身就不是问题,也不意味着任何内存泄漏。
  • @evilrix 类虚拟成员,但没有虚拟dtor。这些类没有受保护/私有的新运算符。事实上,这是一个非常糟糕和糟糕的代码,不应该被发布。那你的意思是什么?
  • @kirsche40 我认为我的观点很清楚。我对标准措辞的解释中哪一点你不明白?请允许我重新措辞:如果您尝试通过基类指针删除,这是一个问题。在这种情况下,如果析构函数不是虚拟的,则行为是未定义的。标准在这一点上异常清晰。我很确定我所说的都没有暗示我在提倡 OP 将其用作实现。
【解决方案2】:

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

【讨论】:

  • 即使他们不喜欢 Pantheios,您链接的页面上的“竞争对手”列表也很实用。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

      您不妨考虑使用徽标系统。 logog 正好提供了这种功能,但它没有 Pantheios 所具有的隐式代码依赖性。 logog 是线程安全的,它允许对在任何时候记录的消息类型进行高度控制。

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

      https://github.com/johnwbyrd/logog.

      【讨论】:

      • 已更新链接,感谢您的注意。
      【解决方案6】:

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

      巧妙地使用流和 ?: 运算符让您可以做到这一点,宏也是如此。

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

        • Poco Logger 非常棒。
        【解决方案8】:

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

        【讨论】:

        • 它是线程安全的
        【解决方案9】:

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

        【讨论】:

        • 不幸的是,c-log 在 GPL 下,这意味着您不能将它与非 GPL 兼容(例如专有商业)软件一起使用。这使得许多用户无法使用它。
        • 现在github.com/0xmalloc/c-log 中没有许可证,可免费用于商业和个人用途。
        • 你是c-log的作者吗?如果是这样,我强烈建议您明确说明(在 Github 页面上,源代码中的自述文件和 cmets)在哪个许可下发布您的软件。即使它是公共领域(我不推荐!),您也应该明确说明。话虽如此,有许多“商业友好”(即许可)开源许可证可供选择 - 最受欢迎的是 Apache、BSD 或 MIT。
        • 仅限Linux? (#include <pthread.h> ...)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-07
        • 1970-01-01
        相关资源
        最近更新 更多