Consultar o Event Viewer com Regular Expressions e PowerShell

Hoje um cliente me pediu uma ajuda para filtrar um log do Event Viewer.

O cliente estava recebendo vários erros de conexão com o banco de dados Oracle. Esses erros estavam sendo gravados no Event Viewer e a quantidade de erros era muito grande para ele identificar se todos os erros eram do mesmo tipo (ORA-02067).

Eu informei que era possível usar o PowerShell e Regular Expressions (RegEx) para obter os logs do Event Viewer.

Exemplo de como obter os registros do log Application para a data atual e armazenar o resultado em uma variável.

$logs = Get-EventLog -LogName Application -after $(get-date).Date

No caso do cliente, os logs estavam em um arquivo exportado do Event Viewer. Para ler o arquivo e armazenar os valores em uma variável, eu utilizei o seguinte comando:

$logs = Get-WinEvent -Path C:\temp\events.evtx

A maioria dos eventos do Event Viewer continha a seguinte mensagem de erro:

Exception message: ORA-02067: transaction or savepoint rollback required

Eu gostaria de verificar se existiam outros erros do Oracle, por exemplo, ORA-02055.

Uilizei a seguinte RegEx para extrair o valor ORA-?????:

"ORA-[\d\.]+"

Nesse padrão, eu busco a palavra ORA seguida de um traço ("-") e de um ou mais decimais.

Para evitar receber toda a mensagem do log que satisfizesse a regra, e selecionar apenas o valor "ORA-?????" de dentro da mensagem, eu atribuí um identificador (errorcode) para a parte que eu gostaria de obter.

"(?<errorid>ORA-([\d\.]+))"

Para fazer a busca no array $logs, eu utilizei um loop (foreach) onde verifico item por item e armazeno o resultado encontrado em um outro array ($errorcodes) para posterior agrupamento.

$errorcodes = @()
foreach ($log in $logs)
{
$log.message  -match "(?<errorid>ORA-([\d\.]+))" | Out-Null

if ($Matches.Count -gt 0)
{
$errorcodes += $matches["errorid"]
}
}
$errorcodes | group | select name, count

 

Para esse cenário, eu encontrei apenas o erro ORA-02067, conforme:

Name              Count
-----                  -----
ORA-02067   926

Uma outra forma de executar o comando acima, é através do acelerador [RegEx] que é uma abreviação para a classe System.Text.RegularExpressions.Regex do .NET Framework:

$errorcodes = @()
$Matches.Clear()
foreach ($log in $logs)
{
$address = [Regex]::Match($log.message, "ORA-([\d\.]+)")
if ( $address.Success)
{
$address.value
}
}
$errorcodes | group | select name, count

 

Apenas por curiosidade, como agora sabemos que existe apenas o erro ORA-02067, também é possível obter os dados do Event Log através do filtro LIKE, conforme:

($logs | ? message -like "*ORA-02067*").count

 

Espero que esse post tenha sido útil. Não deixe de consultar outros artigos disponíveis em:

https://blogs.msdn.microsoft.com/luisdem/tag/powershell/

Maiores detalhes sobre Regular Expressions em:

Regular Expression Language - Quick Reference https://msdn.microsoft.com/en-us/library/az24scfc(v=vs.110).aspx