Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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