我有一个需要大量日志记录的应用程序(服务器应用程序),并且不应该通过启用日志记录来影响性能。
应用程序有一个执行工作的工作线程的线程池。本来我打算只登录这些线程池线程,但是我需要几乎锁定整个线程,所以我的'多线程'应用程序就是这样。
我一直在寻找更好的方法来记录多个线程,我发现使用队列或环形缓冲区可能是一个想法。
任何人都可以建议(可能来自经验)为多线程应用程序实现有效日志记录(主要是文件)的任何好方法,这些应用程序也应保持一定的性能吗?
我想使用Boost Logging Library。
答案 0 :(得分:7)
Pantheios是C ++中最快的日志记录库。我建议使用它而不是Boost Logging。使用Pantheios,您只需登录到该文件,而您无需关心哪个线程。如果需要,您可以将线程名称放在日志行前缀中,并为您完成所有操作。
答案 1 :(得分:3)
就我个人而言,我会看看Pantheios,看了一眼,看起来很有趣,将在我未来的项目中加入。
如果你真的想使用boost记录,我会使用一个同步队列来处理所有内部锁定,这样你的工作人员就不用担心了。
伪代码:
class SynchedQueue {
void write(text) { lock() logfile.write(text) unlock() }
或者,如果您真的想要快速,请使用内部队列并一次从X行中的公共队列传输。公共队列不必等待可能需要相对长时间的文件i / o,并且私有队列很少只获取行。虽然它可能仍然比Pantheios慢。
答案 2 :(得分:2)
我最近在ddj上使用Active Objects读取了一篇有趣的文章:
http://www.drdobbs.com/high-performance-computing/227500074
较早的文章还讨论了线程安全日志记录的一些设计注意事项:
答案 3 :(得分:2)
Apache log4cxx。我已经看到很多地方被广泛使用。其中大多数是交易应用程序,多线程和低延迟应用程序。 log4cxx并不逊于任何日志库,它可用于C ++和Java(Apache log4j),我使用过这两个。
答案 4 :(得分:2)
我正在使用并且非常喜欢Petru Marginean's logging system。它非常轻快,整洁。我花了一点时间才能让我的头围绕它,所以我可以根据自己的喜好进行调整,但是一旦你理解了它,它就是一种美,因为整个库只有250行的1个头文件,它不是很多通过
最慢的部分是它使用带有ostringstream的对象,但我怀疑你会发现更快的东西。至少不是没有比C ++更多的C语言。
在他的second article and version中,他展示了他如何使其成为线程安全的。
如果你找不到源代码,请告诉我,我有。我记得我必须要搜索一下。
答案 5 :(得分:0)