
Este script monitorea el archivo de registro en busca del patrón "ora", extrae los detalles del error y envía un correo electrónico. En este caso, quiero extraer solo el último error que viene en el archivo de registro. Configuré crontab cada 5 minutos, por lo que grep elimina los mismos errores antiguos que causan alertas falsas. El script debería recibir errores con la hora actual y debería evitar buscar el error anterior.
mailto=xyz.email.com
logdirectory=/location/to/logfile
cd $logdirectory
grep "ORA" logfile
if [ $? = 0 ]; then
mailx -s "errors" $mailto
fi
Mi archivo de registro:
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
Respuesta1
Mostrando la opción 2 demi comentariocomosolicitado por 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
o con cáscara:
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"
Tenga en cuenta que primero debe obtener el número de líneas wc
, haga un head
para ese número de líneas y canalice ESO a la cola y luego a grep, de lo contrario, el archivo de registro podría crecer entre grep
y wc
luego se perdería una línea en la siguiente iteración o si intercambió el orden de ellos, entonces podría analizar la misma línea dos veces.
Tenga en cuenta que lo anterior supone que todo lo que se escribe en el archivo de registro lo hace en 1 operación atómica por línea; si escribe partes de líneas por separado y luego adjunta una nueva línea cuando termina, entonces debe ignorar la última línea, posiblemente parcial, del archivo de registro para el análisis anterior.