Welcher Ansatz ist besser zum Lesen der Windows-Ereignisprotokoll in C#? WMI EventLog oder
Ich muss eine Anwendung schreiben, die packen Ereignisprotokoll für System/Anwendungen. Die andere Voraussetzung ist, dass muss ich Lesen-Ereignisprotokoll jede minute oder so zu greifen, die neue event-logs, da ich gelesen habe die Letzte Zeit.
Derzeit überlege ich, auf C# zu implementieren, anstatt C++.
Mit, dass ich Lesen mehrere Webseiten und wenn ich das richtig verstehe, kann ich entweder WMI oder EventLog-Klasse, um zu Lesen-Ereignisprotokoll.
Es scheint mir, dass ich benachrichtigt werden kann, wenn die neue event-log Hinzugefügt, mit der EventLog-Klasse, aber ich war mir nicht sicher, dass ist besser als mit WMI.
Wenn mein Verständnis richtig ist, würde ich gerne wissen, welchen Weg ich nehmen soll?
Bitte geben Sie mir einige Ratschläge. Danke.
InformationsquelleAutor istudy0 | 2011-03-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
WMI ist Mist. Es nutzt Lasten des Arbeitsspeichers und der "Ereignisse" werden erreicht durch polling intern. Sie können auch die Polling-Intervall. Sie sind viel besser zu verwenden, der EventLog-Klasse .NET. Aber wenn Sie brauchen, um Lesen Sie alle Protokolle, die von Windows Vista+ müssen Sie die EventLogReader, wo man Lesen kann-Ereignisse, die die Ereignisse definieren, die nicht über eine Meldung dll-Datei befindet sich unter
sondern es ist ein ProviderGuid angegeben, die anderswo registriert. Dies macht es unmöglich, zu Lesen, viele OS-Nachrichten, die mit dem neuen system. Aber Sie können den EventLogReader Klasse nur auf Rechnern mit OS-Version >= Vista. Sie müssen zwei Ereignis-log-reader-Implementierungen abhängig von der installierten OS, wenn Sie brauchen, um alle Nachrichten.
Der EventLog-Klasse, die auch ziemlich schnell, wenn Sie Lesen Sie die Nachrichten in Blöcken von z.B. 100 Nachrichten von bis zu 4 threads, die keine Verbesserung der Lesegeschwindigkeit von bis zu einem Faktor von 2-3. Ich habe zufällige Fehler für das Security Event Log auf Windows Server 2003 beim Lesen von mehreren threads, aber für die anderen, es hat sehr gut funktioniert von XP 32 Bit bis Windows 7 x64.
InformationsquelleAutor Alois Kraus
Ich weiß, das ist lange nach dem ursprünglichen post, aber ich hoffe, das ist usefule, um zukünftigen Suchenden wie mich, gefunden der EventLog-Klasse, zu langsam. Hier ist etwas code zu zeigen, der Suche nach dem letzten System startup Veranstaltungen:
Wenn Sie wollen nur den neuesten Eintrag, dieser code nahm von 0,28 Sekunden auf meiner Maschine, im Vergleich mit 7.11 Sekunden lang mit der EventLog-Klasse anstelle der for () - Schleife:
Hoffe, es hilft.
Ich ausgeführt den code für einen remote-computer durch die änderung der EventLog default-Konstruktor EventLog("Sicherheit","remoteMachineName","remoteIP"). Im debugger habe ich gesehen, dass die remote-Maschine geschrieben hat fast 250000 Einträge für einen einzelnen Tag. Und die Schleife durch alle von Ihnen ergriffen hat 10 Minuten Zeit, Bitte vorschlagen, wenn es einen besseren Weg, um eine Schleife durch remote-emachine-event-logs.
Ich habe gesehen, EventLogEntry-Hörer..aber wie weit das machbar und richtig für einen remote-computer EventLog. Fordern Sie bitte teilen Sie Ihre Ideen. Danke!
InformationsquelleAutor Ian
Check-out die Klassen im namespace System.Diagnostik.Eventing (und tiefer) anstatt mit der EventLog-Klasse.
Beim Zugriff auf einen remote-computer (vielleicht auch nur Vista und später) mit der EventLog-Klasse, das remote-computer generiert rund 6 security-audit-Einträge wie Sie eine Verbindung für die Protokolle, und ein anderer Eintrag oder 2 jedes mal, wenn Sie rufen Sie einen log-Eintrag in einer Schleife.
Aber mit der EventLogQuery /EventLogReader /EventLogWatcher können Sie eine EventLogSession, dass Sie immer verbunden. Und können Sie abrufen, bestimmte Einträge mithilfe einer XPath-Abfrage in der Erwägung, dass EventLog Kräfte, die Sie zur Iteration über alle Einträge um einen Eintrag finden.
http://msdn.microsoft.com/en-us/library/bb671200.aspx
WARNUNG: Holen Sie sich die event-Nachricht, die Methode EventLogRecord.FormatDescription() ist hit-or-miss, und die Eigenschaft LevelDisplayName ist auch hit-or-miss. Aus diesem Grund bin ich der Umstellung wieder auf die EventLog-Klasse, die für das abrufen der Einträge, und mit den EventLogWatcher für das ansehen Einträge.
InformationsquelleAutor AndyClaw