1

In einer Dienstanwendung durchläuft ich das Windows-Anwendungsereignisprotokoll, um Ereignisse zu analysieren, um abhängig von der Eintragsnachricht zu reagieren. Wenn das Ereignisprotokoll voll ist (Windows stellt normalerweise sicher, dass durch Löschen alter Einträge genügend Speicherplatz verfügbar ist - dies ist in den Einstellungen eventvwr.exe konfigurierbar), läuft der Dienst beim Durchlaufen der EventLog.Entries-Auflistung immer in IndexOutOfBoundsException. Egal, wie ich iteriere (For-Loop, Verwendung des Collections-Enumerators, Kopieren der Collection in ein Array, ...), ich kann diesen "Bug" scheinbar nicht loswerden.Iterieren durch Ereignisprotokolleintragsauflistung, IndexOutOutOfBoundsException

Zurzeit stelle ich sicher, dass das Protokoll nicht voll ist, um den Dienst laufen zu lassen, indem ich regelmäßig die letzten Einträge lösche, indem ich die Ereignisprotokolldatei analysiere und die letzten Knoten lösche (Mach mich nicht fertig, ich könnte nicht finde keine bessere Alternative ...).

Wie kann ich durch die Sammlung iterieren, ohne auf bereits gelöschte Einträge zuzugreifen?

Gibt es wahrscheinlich eine elegantere Methode? Ich versuche nur auf die Logs zuzugreifen, die während der letzten x Sekunden geschrieben wurden (selbst LINQ konnte die Logs nicht auswählen, wenn das Log voll ist - die gleiche Ausnahme), könnte das helfen?

Vielen Dank für jede Beratung und Hinweise

Frank

Edit: Ich vergaß zu erwähnen, dass meine Annahme ist die Schleifen-Einträge zugreifen, die während der Iteration des von Windows gelöscht werden. Im Grunde habe ich deshalb versucht, die Sammlung zu klonen. Gibt es vielleicht eine Möglichkeit, die Sammlung für eine kurze Zeit für meine Anwendung zu sperren?

Antwort

1

Aus praktischer Sicht, warum gibt es überhaupt ein Problem?

Wenn Sie über alle Einträge iterieren möchten, und manchmal, wenn Sie versuchen, einen Eintrag zu lesen, der nicht wirklich existiert, erhalten Sie eine IndexOutOfBoundsException, dann fangen Sie einfach diese Ausnahme und ignorieren sie.

Wenn Sie wissen, was diese Ausnahme bedeutet, und Sie wissen, was Sie tun möchten, behandeln Sie einfach die Ausnahme und arbeiten weiter. Das ist, was Ausnahmen sind für immerhin ...

+0

Sicher, wenn der Eintrag weg ist, gibt es nichts, was ich tun könnte. Wie auch immer, die Schleife bricht in diesem Fall ab und es könnten einige Einträge übersprungen werden, die das Behandlungsereignis in meinem Dienst auslösen sollten. In der nächsten Überprüfungsschleife behandelt mein Programm diese Einträge als veraltet (weil es sie zuvor hätte behandeln sollen) und sie werden niemals überhaupt etwas auslösen. – fjdumont

0

Falls jemand dieses Thema findet:

dieses Verhalten vermeiden scheint nicht möglich zu sein. Auch das Kopieren der Sammlung schlägt fehl und das Sperren der Datei ist nicht möglich (aufgrund von Systemeinschränkungen). Stattdessen implementierte ich einen periodischen Prüfalgorithmus, der das Ereignisprotokoll sichert und es bei einem definierten Verwendungsprozentsatz (z. B. 95%) löscht, sodass ein Überlauf oder eine Löschung nicht stattfinden sollte.

4

Ich habe das auch getroffen, mehr auf 2008R2 Domain Controllers. Das Problem besteht darin, dass die Protokolle umbrochen werden. Daher scheint sich der Index zwischen dem Beginn der Iteration der Ereignisse und dem Zeitpunkt, zu dem Sie diesen Punkt erreicht haben, zu ändern.

Scheint nicht eine andere Heilung als Wiederholung sein.