我正在一个客户端服务器应用程序中工作,其中多个客户端和服务器正在为性能非常关键的金融交易进行基于套接字的通信。目前我正在使用 system.IO 命名空间的 streamwriter 将日志写入文件。对于单个事务,我需要调用 streamwriter 方法 50 次以记录不同的值,对于超过 50,000 个事务,此记录所花费的时间变得非常重要。
如何减少应用程序进行日志记录所花费的时间?我是否需要选择其他方法或任何其他类而不是streamwriter?用更少的时间进行日志记录的最佳方法是什么。
我正在一个客户端服务器应用程序中工作,其中多个客户端和服务器正在为性能非常关键的金融交易进行基于套接字的通信。目前我正在使用 system.IO 命名空间的 streamwriter 将日志写入文件。对于单个事务,我需要调用 streamwriter 方法 50 次以记录不同的值,对于超过 50,000 个事务,此记录所花费的时间变得非常重要。
如何减少应用程序进行日志记录所花费的时间?我是否需要选择其他方法或任何其他类而不是streamwriter?用更少的时间进行日志记录的最佳方法是什么。
如果性能是关键,那么我会考虑查看 Windows 事件跟踪 (AKA ETW)。
使用 .NET 4.5 和EventSource类的引入,这使得 ETW 比过去更容易实现。
Vance Morrison 的博客有一些关于这个主题的好文章。
有关体系结构的概述,请参阅使用 ETW 改进调试和性能调整。
还有来自 Microsoft 模式和实践团队的语义应用程序块,可以更轻松地合并 EventSource 功能和管理日志记录行为。
我建议你试试 Log4Net,你可以配置 where (file, database, xml) 和 when (bath, transaction, ...) 并轻松切换跟踪级别 (debug, info, warning, ...)
从头开始编写日志系统是不值得的。
在将值写入磁盘之前缓存它们。
仅在您完成事务后提交日志。
像这样的东西:
StringBuilder builder = new StringBuilder();
// do transaction step 1
builder.Append("Transaction step 1" + environment.NewLine); // or however you add a line to you log
// step 2
builder.Append("Transaction step 2" + environment.NewLine);
//...
// step 50
builder.Append("Transaction step 50" + environment.NewLine);
// now write to the file
File.WriteAllText(@"C:\log.txt", builder.ToString());
如果在任何步骤中出现错误仍然写入日志,您可以添加一些处理。
您还可以使用一些开源工具,例如 log4net: http: //logging.apache.org/log4net/。
我建议登录数据库(高性能,可能嵌入 sqlite/sqlce)。奖励 - 您可以构建和查询您的日志条目。
为了减少记录所花费的时间,我建议:
提高应用程序性能并能够写出所有这些日志消息的一种方法是将它们排队到 MSMQ 队列中,并在服务器未加载时让 Windows 服务应用程序处理排队的日志消息。您也可以将队列放在完全独立的服务器上。
实施方面,您可以设置使用 MSMQ 处理日志消息的 WCF Web 服务。这比必须设置 Windows 服务更容易。