我有一个服务应用程序,它通过TCP处理客户端请求,并将任何事件写入Windows事件日志。由于此应用程序预计要为许多客户和每个客户在短时间内处理大量请求(假设每秒钟处理1到50个请求),因此我想知道写入Windows事件日志需要多少CPU和时间资源以及写入速度有多快?
更具体地说,连接到EventLog、从EventLog读取和写入的操作对CPU和时间的消耗有多大?
我有一个服务应用程序,它通过TCP处理客户端请求,并将任何事件写入Windows事件日志。由于此应用程序预计要为许多客户和每个客户在短时间内处理大量请求(假设每秒钟处理1到50个请求),因此我想知道写入Windows事件日志需要多少CPU和时间资源以及写入速度有多快?
更具体地说,连接到EventLog、从EventLog读取和写入的操作对CPU和时间的消耗有多大?
不要这样做。事件日志不是为这样的活动而设计的:
事件日志不是通用的日志记录设施。它应该用于报告错误、需要关注的情况,甚至是信息性报告,但不是每一点点的信息都必须写在那里。如果您有重要的日志需求,请使用自己的日志设施,并在事件日志中报告问题(如果有),并指出详细数据的“指针”。
注意:如果真的需要事件日志,至少应用程序应该使用自己的日志目标,而不是标准目标之一(应用程序或更糟糕的系统)。这样就不会影响其他应用程序的操作,并且不会通过其事件“淹没”日志来“隐藏”其他应用程序事件,使得更难以发现其他应用程序事件而不查找它们。
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);
log_event()
都会写入并刷新已打开的文件),另一种基于EventLog(在已注册的EventSource上调用ReportEvent()
)。在我的情况下,文件日志比EventLog快约10倍。在多线程环境中,我会添加关键部分以保护对文件的写入。