Windows事件日志:操作有多快?

我有一个服务应用程序正在通过TCP处理客户端请求,并将任何事件写入Windows事件日志。 由于这个应用程序预计会在很短的时间内服务于许多客户端和大量的请求(比如说每秒1到50个请求),所以我很想知道如何使用密集型(CPU智能和时间智能)和写入Windows EventLog的速度有多快?

更具体地说,连接,读取和写入EventLog的操作有多密集?

Solutions Collecting From Web of "Windows事件日志:操作有多快?"

我用我的2个事件日志类,一个写入文件(每个log_event()写入和刷新已打开的文件)和一个基于事件日志( ReportEvent()调用已注册的EventSource)进行测试。 在我的情况下,文件日志比EventLog快大约10倍。 在多线程环境中,我会添加关键部分来保护写入文件。

在我看来,文件更好:它们很容易在诸如grep之类的工具中分析。 速度对我来说不那么重要。

不要这样做。 事件日志不是为这样的活动而设计的:

  1. 它有一个最大尺寸。
  2. 达到最大大小时,可以覆盖事件或停止日志记录,具体取决于设置(最近的Windows也可以将日志归档并启动一个新日志)。 如果事件未被覆盖,则可以填充分区或阻止其他应用程序,直到日志被手动清除。

事件日志不是一个通用的日志记录工具。 它应该被用来报告错误,需要注意的情况,甚至是信息丰富的报告,但不是每一个必须写在某处的信息。 如果您的日志需求较大,请使用您自己的日志工具,并在事件日志中报告问题(如果有的话),并使用“指针”在需要时查找详细数据。

注意:如果真的需要事件日志,至少应用程序应该使用自己的日志目标,而不是标准目标之一(应用程序或更糟糕的系统)。 这种方式不会影响其他应用程序的操作,也不会“隐藏”其他应用程序事件,使事件“泛滥”日志,更难以发现其他事件,而无需查找它们。

Windows的事件跟踪可能会成为这个级别流量的更好的存储库。

Windows事件跟踪(ETW)是一种高效的内核级跟踪工具,可让您将内核或应用程序定义的事件记录到日志文件中。 您可以实时或从日志文件中使用这些事件,并使用它们来调试应用程序或确定应用程序中发生的性能问题。

示例伪代码:

 const MyApplicationProviderGUID: TGUID = '{47A0DECE-4DCF-4782-BCF4-82AECA6BAAB7}'; private FETWRegistrationHandle: THandle; ... EventRegister(MyApplicationProviderGUID, nil, nil, {out}FETWRegistrationHandle); ... EventWriteString(FETWRegistrationHandle, 0, 0, 'Hello'); EventWriteString(FETWRegistrationHandle, 0, 0, ', '); EventWriteString(FETWRegistrationHandle, 0, 0, 'world'); EventWriteString(FETWRegistrationHandle, 0, 0, '!'); ... EventUnregister(MyApplicationProviderGUID); 

也许Microsoft消息队列(MSMQ)是Windows事件日志的替代方法。 它适用于所有当前版本的Windows,并提供高速,松散耦合的消息。