Анализатор журналов в реальном времени - доступ к файлам каждые несколько секунд

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

  •  21-12-2019
  •  | 
  •  

Вопрос

Я пишу простой скрипт на bash, чтобы анализировать некоторые логи в режиме реального времени, и задаюсь вопросом о том, как подойти к тому факту, что каждые несколько секунд мне приходится находить место в файле, который я закончил читать в предыдущий раз.Прямо сейчас я делаю что-то вроде этого:

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

Таким образом, каждый цикл я извлекаю некоторое количество строк из конца файла и ищу ту, которая была последней в предыдущем запуске.Это будет работать вполне нормально до тех пор, пока за один цикл не будет добавлено больше определенного количества строк.Я всегда могу сказать что-то вроде LINES=10000 но в этом случае будут тысячи бесполезных прогонов только для того, чтобы определить, нашел ли я еще последнюю строку из предыдущего прогона.Мне интересно, могу ли я сделать это несколько эффективнее?

Это было полезно?

Решение

Я думаю, вы ищете что-то подобное этому:

#!/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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top