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-Nullif ($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