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