Frage

Ich habe eine Anwendung geschrieben, die Windows-Protokolle von Linux sammelt, über das Zenoss wmi-Client-Paket.

Es verwendet WQL das Ereignisprotokoll abfragen und analysiert die Rückkehr. Mein Problem versucht, den neuesten Eintrag im Protokoll zu finden.

Ich stolperte über diese die mir die NumberOfRecords Spalte in einer Abfrage wie diese

Select NumberOfRecords from Win32_NTEventLogFile Where LogFileName = 'Application'

und verwenden Sie den Rückgabewert, dass als das höchste Protokoll.

Meine Frage ist, ich habe gehört, dass das Windows-Ereignisprotokoll ein Ringpuffer ist, dass es sie zu den ältesten Protokolle mit neuen überschrieben, wie das Protokoll voll wird. Wird dies einen Einfluss auf NumberOfRecords, als ob das geschieht, wird die „Record“ Eigentum der Ereignisse jedoch weiterhin würde die tatsächliche Anzahl der Datensätze im Ereignisprotokoll zu erhöhen, nicht ändern (wie für jeden Eintrag geschrieben, man fallen gelassen wird ).

Kann jemand Schuppen einen kleinen Einblick, wie dies tatsächlich funktioniert (ob NumberOfRecords ist die höchste Record oder die tatsächliche Anzahl der Ereignisse im Protokoll) und vielleicht eine Lösung vorschlagen?

Aktualisieren

So wissen wir jetzt, dass NumberOfRecords nicht Arbeit auf sie selbst ist, weil das Ereignisprotokoll ein Ringpuffer ist. Die MS-Lösung ist der älteste Datensatz zu erhalten, und fügen Sie NumberOfRecords die tatsächliche aktuelle Datensatz zu erhalten.

Dies ist möglich durch WinAPI, aber ich rufe remote von Linux. Wer weiß, wie ich könnte dies erreichen in meinem Szenario?

Danke

War es hilfreich?

Lösung

NumberOfRecords wird nicht immer die maximale Datensatznummer sein, da die Log-kreisförmig ist und das Protokoll kann gelöscht werden, und Sie können 1 Eintrag haben, aber es ist Rekordzahl von 1000.

Die Art und Weisen Sie dies mit dem Sieg api tun würden, wären die älteste Rekordzahl zu erhalten und die Anzahl der Datensätze im Protokoll hinzufügen, die maximale Datensatznummer zu erhalten. Es sieht nicht so aus wie Win32_NTEventLogFile ein ältestes Datensatz Nummernfeld zu verwenden hat.

Versuchen Sie, die neueste Aufzeichnung jedes Mal, wenn die Log-Abfrage zu bekommen? Sie können Timegenerated verwenden, wenn Sie Win32_NTLogEvent Abfrage alles bekommen> JETZT. Sie können diese Liste iterieren Ihre maximale Satznummer zu finden.

Andere Tipps

Sie müssen die Record des neuesten Rekords, aber es gibt keinen schnellen Weg, um es zu bekommen. Im Allgemeinen müssen Sie:

SELECT RecordNumber FROM Win32_NTLogEvent WHERE LogFile='Application'

Und den max Record durch Ergebnisse finden. Aber dies kann zehn Sekunden oder Minuten dauern, wenn die Größe der Protokolldatei ist groß ... es ist sehr langsam.

Aber! Sie können Anzahl der Datensätze erhalten:

SELECT NumberOfRecords FROM Win32_NTEventlogFile WHERE LogfileName='Application'

Das ist sehr schnell. Und dann die Auswahl reduziert die Suche nach dem neuesten Datensatz Speedup:

SELECT RecordNumber FROM Win32_NTLogEvent WHERE LogFile='Application' AND RecordNumber>='_number_of_records_'

Die Ausführungszeit dieses <= als im allgemeinen Fall.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top