代码之家  ›  专栏  ›  技术社区  ›  LightBulb

Windows事件日志:使用它的操作有多快?

  •  9
  • LightBulb  · 技术社区  · 15 年前

    我有一个服务应用程序,它通过TCP处理客户机请求,并将任何事件写入Windows事件日志。由于这个应用程序可以在短时间内为许多客户机和来自每个客户机的大量请求提供服务(例如,每秒1到50个请求之间),我很想知道(CPU方面和时间方面)有多密集,写入Windows事件日志的速度有多快?

    更具体地说,连接、读取和写入事件日志的操作有多密集?

    4 回复  |  直到 11 年前
        1
  •  6
  •   Michał Niklas    15 年前

    我用我的两个事件日志类做了一个测试,一个写入文件(每个 log_event() 写入并刷新已打开的文件)和基于事件日志的文件( ReportEvent() 调用已注册的EventSource)。在我的例子中,文件日志比事件日志快10倍。在多线程环境中,我将添加关键部分来保护对文件的写入。

    在我看来,文件更好:它们很容易在grep等工具中解析。速度对我来说不那么重要。

        2
  •  12
  •   user160694    15 年前

    别那么做。事件日志不是为此类活动设计的:

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

    事件日志不是常规的日志记录工具。它应该被用来报告错误、需要注意的情况,甚至是信息性的报告,但不是每个信息都要写在某个地方。如果您有heavt日志需求,请使用您自己的日志工具,并在事件日志中报告问题(如果有),其中有一个“指针”,用于在需要时查找详细数据。

    注意:如果确实需要事件日志,那么至少应用程序应该使用自己的日志目标,而不是标准目标(应用程序或更糟的系统)。这样,它不会影响其他应用程序操作,也不会“隐藏”其他应用程序事件“淹没”日志中的事件,从而使得在不查找其他事件的情况下更难发现其他事件。

        3
  •  10
  •   Ian Boyd    14 年前

    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);
    
        4
  •  1
  •   mjn anonym    15 年前

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