代码之家  ›  专栏  ›  技术社区  ›  Tony The Lion

高性能应用程序的多线程日志记录[重复]

  •  13
  • Tony The Lion  · 技术社区  · 14 年前

    我有一个应用程序(服务器应用程序),它需要实现大量的日志记录,并且不应该通过启用日志记录对性能造成太大的影响。

    应用程序有一个执行工作的工作线程的线程池。最初,我只需要登录这些线程池线程,但随后我实际上需要锁定整个线程,于是出现了我的“多线程”应用程序。

    我一直在寻找从多个线程记录日志的更好方法,我发现使用队列或环缓冲区可能是一个好主意。

    有人能为多线程应用程序(可能是根据经验)提供一些好的方法来实现有效的日志记录(主要是对文件)吗?

    我想使用Boost日志库。

    6 回复  |  直到 14 年前
        1
  •  7
  •   m_pGladiator    14 年前

    Pantheios 据我所知,是C++中最快的日志库。我建议使用它而不是增强日志记录。使用pantheios,您只需登录到文件,而不关心从哪个线程开始。如果需要的话,可以将线程名放在日志行前缀中,它可以为您做任何事情。

        2
  •  3
  •   dutt    14 年前

    就我个人而言,我会研究泛神论,看一眼它,它看起来很有趣,将它包括在我未来的项目中。

    如果您真的想使用Boost日志记录,我将使用一个同步队列,它在内部处理所有锁定,这样您的工作人员就不必担心这个问题。

    pseudocode:

     class SynchedQueue {
          void write(text) { lock() logfile.write(text) unlock() }
    

    或者,如果您真的想加快速度,可以使用一个内部队列,一次从公共队列中分批地传输X行。公共队列不必等待文件I/O,这可能需要相当长的时间,而私有队列只能自己获得行。尽管它可能会比泛神论慢。

        3
  •  2
  •   Ralf    14 年前

    我最近在DDJ上阅读了一篇使用活动对象进行mt日志记录的有趣文章:

    http://www.drdobbs.com/high-performance-computing/227500074

    一篇较旧的文章还讨论了线程安全日志记录的一些设计注意事项:

    http://www.drdobbs.com/cpp/201804215

        4
  •  2
  •   DumbCoder    14 年前

    Apache log4cxx . 我见过很多地方广泛使用它。其中大多数是交易应用程序、多线程和低延迟应用程序。Log4Cxx并不比任何日志库差,它适用于C++和Java(Apache Log4J),这2个我已经使用过。

        5
  •  2
  •   user1115652    14 年前

    我正在使用而且非常喜欢 Petru Marginean's logging system . 它真的很轻,很快,很整洁。我花了一点时间才把脑袋转过来,这样我就可以根据自己的喜好来调整它了,但是一旦你理解了它,它就很漂亮了,因为整个图书馆实际上只有一个250行的头文件,要通过它就不多了。

    最慢的部分是它使用了一个对象与奥斯汀流,但我怀疑你会发现任何更快。至少没有C比C++多。

    在他的 second article and version 他向我们展示了他是如何使之安全的。

    如果你找不到源代码,请告诉我,我有它。我记得我得找一下。

        6
  •  0
  •   wageoghe    14 年前

    我不熟悉Boost日志库,所以我不能对此发表评论。

    NLog 支持从C/C++和COM(以及从托管.NET应用程序)中进行日志记录。不确定它是否具有您想要的性能特征。

    你也可以考虑 ETW . 它是在Windows内核中实现的一种高速日志记录系统。我没有使用过它,但微软似乎在推动它,使它更容易与每个版本使用。它们无疑使从托管代码中使用起来更加容易。现在看来,在我看来,设置和获取输出有些复杂。我从来没有认真考虑过实施ETW,所以我不能真正评论它到底有多容易或有多困难。