C++ 用于高性能应用程序的多线程日志记录

C++ 用于高性能应用程序的多线程日志记录,c++,multithreading,logging,C++,Multithreading,Logging,我有一个需要实现大量日志记录的应用程序(服务器应用程序),启用日志记录不会对性能造成太大影响 应用程序有一个执行工作的工作线程的线程池。最初我只想登录这些线程池线程,但接下来我需要锁定整个线程,所以我的“多线程”应用程序就出现了 我一直在寻找更好的方法从多个线程登录,我发现使用队列或环形缓冲区可能是一个好主意 有人能建议(也许是根据经验)为多线程应用程序实现有效日志记录(主要是文件日志记录)的好方法吗 我想使用Boost日志库。据我所知,< P>是C++最快的日志库。我建议使用它而不是Boost

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

应用程序有一个执行工作的工作线程的线程池。最初我只想登录这些线程池线程,但接下来我需要锁定整个线程,所以我的“多线程”应用程序就出现了

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

有人能建议(也许是根据经验)为多线程应用程序实现有效日志记录(主要是文件日志记录)的好方法吗


我想使用Boost日志库。据我所知,

< P>是C++最快的日志库。我建议使用它而不是Boost日志记录。使用Pantheios,您只需登录到该文件,而不必关心来自哪个线程。如果您愿意,您可以将线程名称放在logline前缀中,它可以为您做任何事情。

我个人会查看Pantheios,看一眼,它看起来很有趣,将在我未来的项目中包括它

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

伪代码:

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

或者,如果您真的想加快速度,请使用内部队列,并从公共队列一次传输X行。公共队列不必等待可能需要相对较长时间的文件i/o,而私有队列只获取很少的行。尽管它可能仍然比Pantheios慢。

我最近在ddj上读到一篇有趣的文章,使用活动对象进行mt登录:

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


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

< P>我不熟悉Boost日志库,所以我不能对此发表评论。 支持从C/C++和COM(以及托管的.NET应用程序)进行日志记录。不确定它是否具有您所追求的性能特征


你也可以考虑一下。它是一个在Windows内核中实现的高速日志记录系统。我还没有使用过它,但微软似乎在进一步推动它,使它更易于在每个版本中使用。它们无疑使托管代码更易于使用。就目前的情况而言,在我看来,设置和获取输出有点复杂。我从未认真考虑过实现ETW,因此我无法评论它到底有多容易或难。

我正在使用并且非常喜欢。它真的是轻快整洁。我花了一点时间才弄明白它,这样我就可以根据自己的喜好对它进行调整,但一旦你理解了它,它就是一个美丽的库,因为整个库实际上只有一个250行的头文件,所以不太容易理解

最慢的部分是它使用了一个带有ostringstream的对象,但我怀疑你能找到更快的。至少没有C比C++多。

在他的作品中,他展示了他是如何使其线程安全的


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

不一定是最快的!!你是从哪里得到这些数据的?请看结论部分,他们有一个很好的免责声明!也许值得指出一点:一旦你开始做异步日志记录,如果你的应用程序崩溃,你也有可能丢失最后几个日志条目。由于应用程序在启动日志记录后立即恢复,因此您无法保证所有日志消息在任何给定时间都已写入磁盘。@jalf:那么您建议我怎么做?没有线索。这取决于你的需要。异步日志机制可能仍然是最好的方法,我只是指出了一个重要的注意事项。当然,一种可能的替代方法可能是将日志数据写入比硬盘驱动器更快的介质(SSD磁盘?快速网络连接?),这样它就不会像硬盘驱动器写入那样在宝贵的毫秒内阻塞主机应用程序。您可以添加一个日志级别,该级别的日志在记录期间会阻塞(关键?)所以至少你可以在调查期间确定你的日志。无论如何,对于崩溃,更喜欢事后(核心)而不是日志记录。请参阅此处的更多内容:@m_pGladiator-从哪里开始?任何链接或个人经历?个人经历。在选择Pantheios之前,我测试了几个库。log4cxx是其中一个库,我对它的使用体验很差。ETW很棒,在没有监听器的情况下记录事件实际上是免费的,但即使使用监听器,我发现单个日志事件也远低于一微秒。但是要注意创建跟踪值的成本,即使用随机ToString或隐式反射可能会撤销speed boostmind与我Petru的源代码共享的功能?只是找不到。@athos据我所知,原始文章仍然有代码链接,对于第二个版本,这是