Windows事件日志:它的操作速度有多快?

9

我有一个服务应用程序,它通过TCP处理客户端请求,并将任何事件写入Windows事件日志。由于此应用程序预计要为许多客户和每个客户在短时间内处理大量请求(假设每秒钟处理1到50个请求),因此我想知道写入Windows事件日志需要多少CPU和时间资源以及写入速度有多快?

更具体地说,连接到EventLog、从EventLog读取和写入的操作对CPU和时间的消耗有多大?


你正在写入哪些事件到事件日志中?回答你问题的一个指针可能是,IIS和类似的服务器会写入文本日志,而不是事件日志。 - Lazarus
目前只有简单的文本消息。使用简单的文本文件(日志文件)也是一种选择,但我仍然想更多地了解EventLog。 - LightBulb
4个回答

12

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

  1. 它有一个最大大小。
  2. 当达到最大大小时,它可以根据设置覆盖事件或停止记录(最近的Windows还可以归档日志并启动新日志)。如果事件没有被覆盖,它们可能会填满您的分区或阻止其他应用程序,直到手动清除日志。

事件日志不是通用的日志记录设施。它应该用于报告错误、需要关注的情况,甚至是信息性报告,但不是每一点点的信息都必须写在那里。如果您有重要的日志需求,请使用自己的日志设施,并在事件日志中报告问题(如果有),并指出详细数据的“指针”。

注意:如果真的需要事件日志,至少应用程序应该使用自己的日志目标,而不是标准目标之一(应用程序或更糟糕的系统)。这样就不会影响其他应用程序的操作,并且不会通过其事件“淹没”日志来“隐藏”其他应用程序事件,使得更难以发现其他应用程序事件而不查找它们。


1
+1个好建议,我的应用程序曾经在客户端站点填充事件日志,造成了无尽的麻烦! - David Heffernan
我同意你的建议。在我的情况下,我必须维护一个现有的服务应用程序,它正在写入EventLog,所以我想知道那会对整个应用程序的性能产生多少影响。 - LightBulb
你正在冒着影响Windows和机器上运行的所有应用程序的整体工作的风险。无论如何,这取决于你和你的客户。 - user160694
另外请注意我的注释,使用专门为应用程序设计的事件日志,以避免“淹没”标准事件日志。 - user160694

10

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);

这听起来非常有趣。我得多了解一下,因为它似乎是一种非常好的方法,可以收集和分析实时应用程序性能(以及其他方面)。 - LightBulb
1
是的,它不像事件日志那样易于使用,但性能更高。 - Steve Townsend

6
我使用了两种事件日志类进行测试,一种将日志写入文件(每个log_event()都会写入并刷新已打开的文件),另一种基于EventLog(在已注册的EventSource上调用ReportEvent())。在我的情况下,文件日志比EventLog快约10倍。在多线程环境中,我会添加关键部分以保护对文件的写入。
在我看来,文件更好:它们可以轻松地在grep等工具中解析。速度对我来说不那么重要。

这正是我想要的答案。我也同意使用日志文件是一种更好、更快、更简单的方法,但我被分配了一个任务,需要维护一个将所有事件写入Windows事件日志的现有服务应用程序。我认为它是一种“重量级”的日志记录设施,所以我才问了我的问题。 - LightBulb

1
也许 Microsoft Message Queuing (MSMQ) 是 Windows EventLog 的替代品。它在所有当前版本的 Windows 中都可用,并提供高速、松散耦合的消息传递。

MSMQ 听起来也很有趣。我会多了解一下,看看它是否对我的工作有用。 - LightBulb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接