Echtzeit-Protokollanalysator – Dateizugriff alle paar Sekunden
-
21-12-2019 - |
Frage
Ich schreibe ein einfaches Skript in Bash, um einige Protokolle in Echtzeit zu analysieren, und frage mich, wie ich mit der Tatsache umgehen soll, dass ich alle paar Sekunden einen Platz in der Datei finden muss, die ich beim letzten Mal gelesen habe.Im Moment mache ich so etwas:
LOG_FILE=path_to_file
DELAY=1 #time between refresh
LINES=100 #lines to read at one cycle
LAST=$(tail -n 1 $LOG_FILE)
IFS=$'\n'
while true;
do
clear;
found=0
LOG=$(tail -n $LINES $LOG_FILE)
for line in $LOG
do
if [ $line = $LAST ]; then
found=1
continue
fi
if [ $found = 0 ]; then
continue
fi
#Analyzing counting nd stuff.
echo "$stuff"
done
LAST=$line
sleep $DELAY;
done
Also hole ich in jedem Zyklus eine bestimmte Anzahl von Zeilen vom Ende der Datei ab und suche nach der Zeile, die im vorherigen Durchlauf die letzte war.Dies funktioniert solange einwandfrei, bis in einem Zyklus mehr als die definierte Anzahl Zeilen hinzugefügt wird.Ich kann immer so etwas sagen wie LINES=10000
aber in diesem Fall wird es Tausende nutzloser Durchläufe geben, nur um festzustellen, ob ich die letzte Zeile aus dem vorherigen Durchlauf schon gefunden habe.Ich frage mich, ob ich es etwas effizienter machen kann?
Lösung
Ich glaube, Sie suchen nach so etwas:
#!/bin/bash
GAP=10 #How long to wait
LOGFILE=$1 #File to log to
if [ "$#" -ne "1" ]; then
echo "USAGE: `basename $0` <file with absolute path>"
exit 1
fi
#Get current long of the file
len=`wc -l $LOGFILE | awk '{ print $1 }'`
echo "Current size is $len lines."
while :
do
if [ -N $LOGFILE ]; then
echo "`date`: New Entries in $LOGFILE: "
newlen=`wc -l $LOGFILE | awk ' { print $1 }'`
newlines=`expr $newlen - $len`
tail -$newlines $LOGFILE
len=$newlen
fi
sleep $GAP
done
exit 0