这是为Application编写日志的最基于性能的方法

时间:2013-01-22 10:57:14

标签: c# .net logging streamwriter

我在客户端服务器应用程序中工作,其中多个客户端和服务器正在进行基于套接字的通信,以进行性能非常关键的金融交易。目前我正在使用system.IO命名空间的streamwriter来写入文件中的日志。对于单个事务,我需要调用streamwriter方法50次以记录不同的值,并且对于超过50,000个事务,此日志记录所花费的时间变得非常重要。

如何减少应用程序进行日志记录所需的时间?我是否需要选择其他方法或任何其他类而不是编写器?用较短的时间进行日志记录的最佳方式是什么。

6 个答案:

答案 0 :(得分:6)

如果性能是关键,那么我会考虑查看Windows事件跟踪(AKA ETW)。

使用.NET 4.5和EventSource类的引入,这使得ETW比过去更容易实现。

Vance Morrison's Weblog有一些关于这个主题的好文章。

有关架构的概述,请参阅Improve Debugging And Performance Tuning With ETW

微软的模式和版本中还有Semantic Application Block。实践团队,可以更轻松地合并EventSource功能并管理日志记录行为。

答案 1 :(得分:1)

我建议你试试Log4Net,你可以配置哪里(文件,数据库,xml)和何时(浴室,交易......)并轻松切换跟踪级别(调试,信息,警告......)

从头开始编写日志系统是不值得的。

答案 2 :(得分:0)

在将值写入磁盘之前缓存这些值。

只有在完成交易后才提交日志。

这样的事情:

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/

答案 3 :(得分:0)

我建议登录数据库(高性能,可能是嵌入式sqlite / sqlce)。奖金 - 您可以构建和查询日志条目。

答案 4 :(得分:0)

为减少记录所需的时间,我建议:

  • 确保记录的数据需要最少的转换/格式化
  • 创建或使用以下日志记录库:
    • 调用时将记录数据(以及时间,线程ID和其他标记记录)放入缓冲区。
    • 定期将缓冲的数据刷新到磁盘(即,当缓冲的数据大到足以填充日志文件中的至少一个物理块时,或者在系统空闲时立即刷新,或者每隔x秒定期刷新)。
    • 锁定日志文件以进行独占写访问,因此您可以在软件运行时查看它,但其他进程无法将其锁定在您的脚下。
    • 使用单独的线程来处理冲洗,即不要减慢工作线程的速度。
  • 如果您有许多服务器进程,请考虑使用IPC将日志数据发送到单个点,以最大限度地减少正在写入的活动文件的数量和正在使用的缓冲区数量(您可能需要进行测试,看看这是否值得它,你可能需要添加标签来显示每个条目的来源。)
  • 对日志进行预定/空闲时间备份,以防止日志过大。

答案 5 :(得分:0)

提高应用程序性能并能够写出所有这些日志消息的一种方法是将它们排队到MSMQ队列中,并让Windows服务应用程序在服务器未加载时处理排队的日志消息。您也可以将队列放在完全独立的服务器上。

实现方面,您可以设置使用MSMQ处理日志消息的WCF Web服务。这比设置Windows服务更容易。