Windows EventLog: Как быстро работают с ним? - PullRequest
9 голосов
/ 30 ноября 2010

У меня есть служебное приложение, которое обрабатывает клиентские запросы по TCP и записывает любые события в Windows EventLog. Поскольку ожидается, что это приложение будет обслуживать множество клиентов и множество запросов от каждого клиента за короткий промежуток времени (скажем, от 1 до 50 запросов в секунду), мне интересно знать, насколько интенсивно (с точки зрения процессора и времени) и насколько быстро может быть запись в Windows EventLog?

В частности, насколько интенсивны операции подключения, чтения и записи в EventLog?

Ответы [ 4 ]

12 голосов
/ 30 ноября 2010

Не делай этого. Журнал событий не предназначен для такой деятельности:

  1. Максимальный размер.
  2. Когда достигается максимальный размер, он может перезаписывать события или останавливать ведение журнала, в зависимости от настроек (последние Windows также могут архивировать журнал и запускать новый). Если события не перезаписываются, они могут заполнить ваш раздел или заблокировать другие приложения, пока журналы не будут очищены вручную.

Журнал событий не является общим средством ведения журнала. Его следует использовать, чтобы сообщать об ошибках, ситуациях, требующих внимания, и даже информативных отчетах, но не о каждой мелочи, которую нужно где-то писать. Если у вас есть большие потребности в журнале, используйте свои собственные средства ведения журнала и сообщайте о проблемах - если таковые имеются - в журнале событий с «указателем», где можно найти подробные данные при необходимости.

ПРИМЕЧАНИЕ: если действительно необходим журнал событий, то, по крайней мере, приложение должно использовать свое собственное место назначения журнала, а не одно из стандартных (приложение или, что еще хуже, система). Таким образом, это не повлияет на операции других приложений и не «спрячет» другие события приложения, «затопляя» журнал своими событиями, затрудняя обнаружение других без их поиска.

10 голосов
/ 30 ноября 2010

Трассировка событий для 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);
6 голосов
/ 30 ноября 2010

Я сделал тест с моими 2 классами журнала событий, один записывает в файл (каждый log_event() записывает и сбрасывает в уже открытый файл) и один на основе EventLog (ReportEvent() вызов на уже зарегистрированном EventSource).В моем случае файл журнала был примерно в 10 раз быстрее, чем EventLog.В многопоточной среде я бы добавил критическую секцию для защиты записи в файл.

На мой взгляд, файлы лучше: их легко разбирать в таких инструментах, как grep.Скорость для меня менее важна.

1 голос
/ 30 ноября 2010

Может Microsoft Message Queuing (MSMQ) является альтернативой Windows EventLog. Он доступен во всех текущих версиях Windows и обеспечивает высокоскоростную, слабо связанную передачу сообщений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...