Analyseur de journaux en temps réel - accès aux fichiers toutes les quelques secondes
-
21-12-2019 - |
Question
J'écris un script simple en bash, pour analyser certains journaux en temps réel et je me demande comment aborder le fait que toutes les quelques secondes, je dois trouver une place dans le fichier que j'ai fini de lire la fois précédente.En ce moment, je fais quelque chose comme ceci :
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
Ainsi, à chaque cycle, je récupère un certain nombre de lignes à la fin du fichier et je recherche celle qui était la dernière de l'exécution précédente.Cela fonctionnera très bien jusqu'à ce que, dans un cycle, un nombre supplémentaire de lignes défini soit ajouté.Je peux toujours dire quelque chose comme LINES=10000
mais dans ce cas, il y aura des milliers d'exécutions inutiles juste pour déterminer si j'ai encore trouvé la dernière ligne de l'exécution précédente.Je me demande si je peux le faire un peu plus efficacement ?
La solution
Je pense que vous cherchez quelque chose comme ceci :
#!/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