我们有一个应用程序可以记录当前使用streamwriter的文件。在我们正在考虑扩展应用程序时,日志记录块正在阻碍。该应用程序是多线程的,可以使用数千个线程计数执行。线程计数不会触及CPU,因为大多数职责是动态处理TCP套接字。但是日志记录是一个问题,因为这里存在融合,并且各个线程的性能在此受到影响。
我想得到大家的意见,了解可以遵循什么样的架构/设计进行记录。
我正在考虑使用数据库作为日志记录接收器。但作者必须拥有我所感受到的锁定机制。我不认为,我应该尝试在线程中创建大量的记录器。另一种选择我正在考虑在记录器上进行池化。
我是否还应该看看MSMQ类型的技术来快速移出流量?
答案 0 :(得分:4)
我会查看现有的日志记录框架,例如log4net或Microsoft的Enterprise Library Logging Application Block。 (我已经使用了log4net,但没有使用Logging Application Block。)
我非常怀疑你的情况是独一无二的 - 如果你选择第三方解决方案而不是本土解决方案,你将能够从其他开发者的经验中受益。
如果你做滚动你自己并想要一个生产者/消费者模型,你可能想看看.NET 4中的并发集合。正如mhenrixon所提到的,你几乎肯定要在性能和可靠性之间找到平衡点。如果这仅适用于调试日志,那么如果应用程序突然关闭会丢失一些,那么它可能并不重要 - 但显然,如果日志包含 的审计记录,那么这是另一回事坚持下去。
答案 1 :(得分:2)
您还应该考虑NLog,特别是NLog 2.0(目前处于测试阶段 - 自9月以来)。除此之外,NLog 2.0还增加了记录asynchronously的功能。实质上,您将配置要记录的目标(相当于log4net Appender)(文件,数据库等)。然后,通过配置,您使用异步目标包装器“包装”每个Target。 NLog在配置文件中也有一个选项,可以使所有日志记录异步。
虽然我们讨论的是日志记录,但您也可以考虑使用Common.Logging for .NET之类的日志记录抽象。这使您可以选择推迟对底层框架(log4net,NLog等)的最终决策,还可以选择编写自己的记录器(可以通过Common.Logging轻松公开)。
答案 2 :(得分:1)
听起来你是在追求log4net被称为Appender Buffering的东西,认为如果日志记录不能“有损”我不建议使用队列。我相信任何日志框架都可以通过MSMQ日志记录轻松扩展。