
Este script monitora o arquivo de log para o padrão "ora", extrai detalhes do erro e envia email. Nesse caso, quero extrair apenas o último erro que vem no arquivo de log. Eu configurei o crontab para cada 5 minutos, então o grep retira os mesmos erros antigos que causam alertas falsos. O script deve receber erros com a hora atual e evitar procurar o erro antigo.
mailto=xyz.email.com
logdirectory=/location/to/logfile
cd $logdirectory
grep "ORA" logfile
if [ $? = 0 ]; then
mailx -s "errors" $mailto
fi
Meu arquivo de log:
Fri Jun 07 05:09:32 2019 Archived Log entry 93 added for thread 1 sequence 59 ID 0xf10d426f dest 1:
Fri Jun 07 11:08:20 2019 07-JUN-19 ORA-1100: Testing, Please Ignore
Responder1
Mostrando a opção 2 demeu comentáriocomosolicitado pelo OP:
awk -v parseLog='/some/where/filename' '
BEGIN {
prevNR=( (getline line < parseLog) > 0 ? line : 0 )
}
(NR>prevNR) && /ORA/{ print; found=1 }
END {
print NR > parseLog
exit !found
}
' /location/to/logfile
ou em casca:
parseLog='/some/where/filename'
IFS= read -r line < "$parseLog"
if [[ -n "$line" ]]; then
prevNR="$line"
else
prevNR=0
fi
nr=$(wc -l < /tmp/logfile)
head -"$nr" /location/to/logfile |
tail +"$(( "$prevNR" + 1 ))" |
grep ORS
rslt=$?
printf '%d\n' "$nr" > "$parseLog"
Observe que você precisa obter o número de linhas wc
primeiro, faça um head
para esse número de linhas e canalize ISSO para o final e depois para o grep, caso contrário o arquivo de log poderá crescer entre o grep
e o wc
e então você perderá uma linha no seu próximo iteração ou se você trocou a ordem deles, poderá analisar a mesma linha duas vezes.
Observe que o acima assume que tudo o que está sendo gravado no arquivo de log o faz em 1 operação atômica por linha - se estiver escrevendo partes de linhas separadamente e, em seguida, anexando uma nova linha quando terminar, você precisará ignorar a última linha, possivelmente parcial, do log para a análise acima.