Analyseur de journaux en temps réel - accès aux fichiers toutes les quelques secondes

StackOverflow https://stackoverflow.com//questions/22011879

  •  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 ?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top