Pergunta

Escrevi um aplicativo que coleta logs do Windows do Linux, através do pacote Zenoss WMI-Client.

Ele usa o WQL para consultar o log de eventos e analisa o retorno. Meu problema é tentar encontrar a entrada mais recente no log.

Eu tropecei isto que me diz para usar a coluna NumberOfrecords em uma consulta como esta

Select NumberOfRecords from Win32_NTEventLogFile Where LogFileName = 'Application'

e use o valor de retorno disso como o log mais alto.

Minha pergunta é: ouvi dizer que o log de eventos do Windows é um buffer circular, é isso substituindo seus logs mais antigos com novos à medida que o log fica cheio. Isso terá um impacto no númerofreto, como se isso acontecesse, a propriedade "RecordNumber" dos eventos continuará aumentando, no entanto, o número real de registros no log de eventos não mudaria (como para cada entrada escrita, um é descartado ).

Alguém pode lançar algumas dicas sobre como isso realmente funciona (se o número de registros é o número mais alto de registro ou o número real de eventos no log) e talvez sugerir uma solução?

Atualizar

Então, sabemos agora que o númerofretos não funcionará por conta própria porque o log de eventos é um buffer de anel. A solução MS é obter o registro mais antigo e adicioná -lo ao número de contratos para obter o registro mais recente real.

Isso é possível através do Winapi, mas estou ligando remotamente do Linux. Alguém sabe como eu poderia conseguir isso no meu cenário?

Obrigado

Foi útil?

Solução

O númerofretos nem sempre será o número do registro máximo porque o log é circular e o log pode ser limpo e você pode ter 1 entrada, mas o número de registro é 1000.

A maneira como você faria isso usando a API Win seria obter o número de registro mais antigo e adicionar o número de registros no log para obter o número do registro máximo. Não se parece com o Win32_NeventLogFile tem um campo de número de registro mais antigo para usar.

Você está tentando obter o registro mais recente toda vez que você consulta o log? Você pode usar o TimeGenerated ao consultar o Win32_ntLoGevent para obter tudo> agora. Você pode iterar essa lista para encontrar seu número de registro máximo.

Outras dicas

Você precisa do número de registro do mais novo registro, mas não há maneira rápida de obtê -lo. Geralmente, você tem que:

SELECT RecordNumber FROM Win32_NTLogEvent WHERE LogFile='Application'

E encontre o número de registro máximo através dos resultados. Mas isso pode levar dezenas de segundos ou minutos se o tamanho do arquivo de log for grande ... é muito lento.

Mas! Você pode obter o número de registros:

SELECT NumberOfRecords FROM Win32_NTEventlogFile WHERE LogfileName='Application'

Isso é muito rápido. E depois reduza a seleção para acelerar a busca do registro mais recente:

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

O tempo de execução deste caso em geral.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top