Domanda

Ho scritto un'applicazione che raccoglie i log di Windows da Linux, tramite il pacchetto Zenoss wmi-client.

Utilizza WQL per interrogare il registro eventi e analizza il ritorno.Il mio problema è cercare di trovare l'ultima voce nel registro.

Mi sono imbattuto Questo che mi dice di utilizzare la colonna NumberOfRecords in una query come questa

Select NumberOfRecords from Win32_NTEventLogFile Where LogFileName = 'Application'

e utilizzare il valore restituito da quello come registro più alto.

La mia domanda è: ho sentito che il registro eventi di Windows è un buffer circolare, ovvero sovrascrive i registri più vecchi con quelli nuovi man mano che il registro si riempie.Ciò avrà un impatto su NumberOfRecords, poiché se ciò accadesse, la proprietà "RecordNumber" degli eventi continuerà ad aumentare, tuttavia il numero effettivo di record nel registro eventi non cambierebbe (poiché per ogni voce scritta, una viene eliminata ).

Qualcuno può fornire informazioni su come funziona effettivamente (se NumberOfRecords è il RecordNumber più alto o il numero effettivo di eventi nel registro) e magari suggerire una soluzione?

Aggiornamento

Quindi ora sappiamo che NumberOfRecords non funzionerà da solo perché il registro eventi è un buffer ad anello.La soluzione MS consiste nell'ottenere il record più vecchio e aggiungerlo a NumberOfRecords per ottenere il record effettivo più recente.

Questo è possibile tramite WinAPI, ma sto chiamando in remoto da Linux.Qualcuno sa come potrei ottenere questo risultato nel mio scenario?

Grazie

È stato utile?

Soluzione

NumberOfRecords non sarà sempre il numero massimo di record perché il registro è circolare e può essere cancellato e potresti avere 1 voce ma il numero di record è 1000.

Il modo in cui lo faresti utilizzando Win API sarebbe ottenere il numero di record più vecchio e aggiungere il numero di record nel registro per ottenere il numero di record massimo.Non sembra che Win32_NTEventLogFile abbia un campo numero di record più vecchio da utilizzare.

Stai tentando di ottenere il record più recente ogni volta che interroghi il registro?Puoi utilizzare TimeGenerated quando esegui una query su Win32_NTLogEvent per ottenere tutto > ADESSO.Puoi scorrere l'elenco per trovare il numero massimo di record.

Altri suggerimenti

È necessario il RecordNumber del record più recente, ma non esiste un modo rapido per ottenerlo.In generale, devi:

SELECT RecordNumber FROM Win32_NTLogEvent WHERE LogFile='Application'

E trova il RecordNumber massimo attraverso i risultati.Ma l'operazione può richiedere decine di secondi o minuti se la dimensione del file di registro è grande... è molto lenta.

Ma!Puoi ottenere il numero di record:

SELECT NumberOfRecords FROM Win32_NTEventlogFile WHERE LogfileName='Application'

Questo è molto veloce.E poi riduci la selezione per velocizzare la ricerca del record più recente:

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

Il tempo di esecuzione di questo <= rispetto al caso generale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top