这是为应用程序编写日志的最基于性能的方法

本文关键字:于性能 性能 方法 应用程序 日志 | 更新日期: 2023-09-27 17:55:13

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

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

这是为应用程序编写日志的最基于性能的方法

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

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

万斯·莫里森(Vance Morrison)的博客有一些关于这个主题的好文章。

有关体系结构的概述,请参阅使用 ETW 改进调试和性能优化。

还有来自Microsoft模式和实践团队的语义应用程序块,可以更轻松地合并EventSource功能并管理日志记录行为。

我建议您尝试Log4Net,您可以配置位置(文件,数据库,xml)和时间(bath,事务等),并轻松切换跟踪级别(调试,信息,警告等)

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

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

为了减少日志记录所花费的时间,我建议:

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

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

仅在完成事务后提交日志。

像这样:

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/。

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

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