Próbuję skonfigurować skrypt, w którym generowany jest alert, gdy określony ciąg pojawia się w pliku dziennika.Jak potokować -f w awk
Rozwiązanie już na miejscu wyświetla cały plik dziennika raz na minutę i zlicza częstotliwość pojawiania się ciągu, używając znacznika czasu linii dziennika do zliczania tylko wystąpień z poprzedniej minuty.
Pomyślałem, że byłoby znacznie bardziej efektywne, aby zrobić to z ogonem, więc próbowałem następujące, jako test:
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);
}
'
ale to po prostu zawiesza się i nie robi nic wyjściowego. Ktoś zasugerował tę niewielką zmianę:
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)
ale to robi to samo.
Awk, którego używam (Uprościliśmy w powyższym kodzie) działa tak, jak jest używany w istniejącym skrypcie, w którym są przesyłane wyniki z grep "^ $ TIMESTAMP".
Moje pytanie brzmi: w jaki sposób można uzyskać ogon -f do pracy z awk?
Kiedy 'tail -f', twój skrypt awk nigdy nie dojdzie do KONIEC. Wciąż liczycie błędy, ale nigdy niczego nie drukujecie. Potrzebujesz innego warunku (na przykład, wykrywając, że to nowy dzień), który uruchamia printf i resetuje licznik.Pokaż nam próbkę Twojego dziennika, a my możemy zaproponować poprawkę. – ghoti