[英]Windows EventLog: How fast are operations with it?
我有一个服务应用程序,通过TCP处理客户端请求并将任何事件写入Windows EventLog。 由于这个应用程序预计会在很短的时间内为每个客户端提供大量请求(假设每秒1到50个请求),我很想知道它是多么密集(CPU明智和时间)和写入Windows EventLog的速度有多快?
更具体地说,连接,读取和写入EventLog的操作有多密集?
不要那样做。 事件日志不适用于此类活动:
事件日志不是常规日志记录工具。 它应该用于报告错误,需要注意的情况,甚至是信息性报告,但不是用于在某处写入的每一点信息。 如果您有大量日志需求,请使用您自己的日志工具并在事件日志中使用“指针”报告问题(如果有),以便在需要时查找详细数据。
注意:如果确实需要事件日志,那么至少应用程序应该使用自己的日志目标,而不是标准目标之一(应用程序甚至更糟糕的系统)。 这样它就不会影响其他应用程序操作,并且不会“隐藏”其他应用程序事件“淹没”日志及其事件,使得更难以发现其他应用程序事件而不查找它们。
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);
我用我的2个事件日志类进行了测试,一个写入文件(每个log_event()
写入并刷新已打开的文件),另一个基于EventLog( ReportEvent()
调用已注册的EventSource)。 在我的情况下,文件日志比EventLog快10倍。 在多线程环境中,我会添加关键部分来保护写入文件。
在我看来文件更好:它们很容易在像grep这样的工具中解析。 速度对我来说不那么重要。
也许Microsoft消息队列(MSMQ)是Windows EventLog的替代品。 它适用于所有当前版本的Windows,并提供高速,松散耦合的消息传递。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.