Итерация по коллекции записей в журнале событий, IndexOutOutOfBoundsException - PullRequest
1 голос
/ 12 января 2011

в приложении-службе. Я перебираю журнал событий приложения Windows для анализа событий, чтобы отреагировать на входящее сообщение.В случае, если журнал событий заполнен (обычно Windows удаляет достаточно места, удаляя старые записи - это настраивается в настройках eventvwr.exe), служба всегда запускается в IndexOutOfBoundsException при выполнении итерации по EventLog.Entriesколлекция.Независимо от того, как я выполняю итерацию (цикл for, использование перечислителя коллекций, копирование коллекции в массив, ...), я не могу избавиться от этого «ошибки».

В настоящее время яУбедитесь, что журнал не переполнен, чтобы служба работала, регулярно удаляя последние несколько элементов, анализируя файл журнала событий и удаляя последние несколько узлов (Не бейте меня, я не мог найти лучшую альтернативу...).

Как выполнить итерацию по коллекции, не пытаясь получить доступ к уже удаленным записям?

Возможно, существует более элегантный метод?Я только пытаюсь получить доступ к журналам, записанным в течение последних x секунд (даже LINQ не смог выбрать те из них, когда журнал заполнен - ​​то же исключение), может ли это помочь?

Спасибо за любые советы и советы

Франк

Редактировать: я забыл упомянуть, что я предполагаю, что циклы обращаются к записям, которые удаляются во время итерации Windows.По сути, именно поэтому я попытался клонировать коллекцию.Возможно, есть способ заблокировать коллекцию на некоторое время только для моего приложения?

Ответы [ 3 ]

4 голосов
/ 23 августа 2011

Я тоже это сделал, особенно на контроллерах домена 2008R2. Проблема в том, что журналы упаковываются, и поэтому кажется, что индекс меняется между тем, когда вы начали итерировать события, и когда вы достигли этой точки.

Не похоже, что это лекарство, кроме повторных попыток.

1 голос
/ 12 января 2011

Если смотреть на это с практической точки зрения, почему вообще возникает проблема?

Если вы хотите перебирать все записи, а иногда, когда вы пытаетесь прочитать запись, которая нена самом деле вы получаете IndexOutOfBoundsException, затем просто перехватываете это исключение и игнорируете его.

Если вы знаете, что означает это исключение, и знаете, что вы хотите сделать, просто обработайте исключение и продолжайте работать.В конце концов, для этого и существуют исключения ...

0 голосов
/ 17 января 2011

На случай, если кто-нибудь найдет эту тему:

Избежать такого поведения не представляется возможным. Даже копирование коллекции завершается неудачно, и блокировка файла невозможна (из-за системных ограничений). Вместо этого я реализовал алгоритм периодической проверки, который создает резервную копию журнала событий и очищает его с определенным процентом использования (например, 95%), чтобы не происходило переполнение или удаление.

...