Estoy intentando configurar un script donde se genera una alerta cuando aparece una determinada cadena en un archivo de registro.Cómo pasar tail -f en awk
La solución ya implementada grepea todo el archivo de registro una vez por minuto y cuenta la frecuencia con que aparece la cadena, utilizando la marca de tiempo de la línea de registro para contar solo las ocurrencias del minuto anterior.
que pensé que sería mucho más eficiente de hacer esto con una cola, así que trataron los siguientes, como una prueba:
FILENAME="/var/log/file.log"
tail -f $FILENAME | awk -F , -v var="$HOSTNAME" '
BEGIN {
failed_count=0;
}
/account failure reason/ {
failed_count++;
}
END {
printf("%saccount failure reason (Errors per Interval)=%d\n", var, failed_count);
}
'
pero esto simplemente se cuelga y no hace nada de salida. Alguien sugirió este pequeño cambio:
FILENAME="/var/log/file.log"
awk -F , -v var="$HOSTNAME" '
BEGIN {
failed_count=0;
}
/account failure reason/ {
failed_count++;
}
END {
printf("%saccount failure reason (Errors per Interval)=%d\n", var, failed_count);
}
' <(tail -f $FILENAME)
pero eso hace lo mismo.
El awk que estoy usando (He simplificado en el código anterior) funciona, como se usa en el guión existente donde los resultados de grep "^ $ TIMESTAMP" se canalizan en ella.
Mi pregunta es, ¿cómo se puede hacer funcionar el tail -f con awk?
Cuando 'tail -f', su script awk nunca llega a un FINAL. Así que sigues contando errores, pero nunca imprimes nada. Necesita otra condición (por ejemplo, detectar que es un nuevo día) que ejecuta su printf y restablece el contador.Muéstranos una muestra de tu registro, y podemos sugerir una solución. – ghoti