记录到MSMQ /文本文件/数据库的性能比较

时间:2010-02-22 20:26:17

标签: .net logging msmq enterprise-library

我们有几种登录.NET(C#)服务器应用程序的选择。我们将使用企业库。所以这里有方法:

1)同步向MSMQ写入日志,然后用Win Service读取MSMQ。队列位于服务器应用程序的本地计算机上 2)同步写入磁盘(即滚动文本文件)。
3)同步将日志写入数据库(Oracle,在我们的应用程序中)。

日志量可能相当高。那么哪一个是最高效的?我猜订单是1,2,3。我是对的吗?除了写入速度之外,在这种特定情况下还有其他性能因素吗?还有其他选择,我在这里没有指出,这可能是更好的方法吗?

3 个答案:

答案 0 :(得分:4)

没有听取应用程序在日志记录方面的需求:

我觉得MSMQ日志记录场景对这个问题来说有点大麻烦。

MSMQ肯定会更快,因为您的应用程序将使用网络通信协议,而不是处理磁盘延迟和数据库连接创建&拆除。尽管如此,MSMQ使用磁盘,增益可能微不足道。然后问题是MSMQ目标/目标队列是否在本地计算机上。

坚持使用磁盘记录

考虑使用适当的翻转(根据需要按天/小时)记录磁盘上的文件。如果您关注主轴速度,有一些解决方法 - 考虑将这些日志文件写入RAM磁盘。然后根据您的需要定期将这些文件从RAM中复制到磁盘上并定期复制到磁盘上。

衡量您的记录效果需求

提到关于过早优化的笑话。测量并再次测量。在判断解决方案的执行情况之前,您根本不知道自己需要什么。考虑到您可能拥有10,000rpm的主轴,并且磁盘日志记录解决方案可能会充分发挥作用。如果决定跳转到像MSMQ或数据库写入这样的“外包”组件的复杂解决方案,那么YAGNI可能会陷入困境。我说这与你所说的速度有关。

答案 1 :(得分:1)

我认为你应该考虑“异步写日志到数据库”。即,对于要记录的每个项目,将其排入内存并使用单独的线程写入数据库。如果记录消息的顺序由排队机制维护,那么保持主应用程序等待记录完成是没有意义的。

另外,你看过log4net吗?它包括许多日志选项,包括强大的磁盘旋转日志,UDP日志记录......

您可能还希望将Splunk视为在制作日志文件后搜索日志文件的方法。

答案 2 :(得分:1)

在典型情况下,您对MSMQ,文件和数据库的排名应该是正确的。

我知道你关注性能,但我还没有在业务应用程序中遇到一个场景,我后悔所使用的日志记录机制。与执行业务逻辑所花费的时间相比,记录所花费的时间并不重要。

此外,如果您真的关心性能,您可能需要调查除Enterprise Library之外的其他选项。例如log4net历来运行得更快。

除了表现,我还会考虑其他要求。例如您需要报告或查询日志吗?您是否需要中央日志存储库(或者它是否有用)?如果这些问题的答案都是肯定的,那么您可能希望使用数据库或MSMQ来提供数据库。

其他考虑因素可能是现有的实施或标准,整体解决方案的复杂性(MSMQ>文件),各种选项的可支持性(例如,如果没有运营专业知识,您可能不想使用MSMQ。)