Назад | Перейти на главную страницу

Как измерить скорость появления новых строк в файле (файле журнала)

Я пытаюсь получить размер файла журнала линия пишет с течением времени, в идеале с текущей скоростью и средними значениями за 1, 5 и 15 минут.

Я мог бы сделать что-то вроде этого:

watch wc -l /var/log/<my_file>

.. и, ну, посчитал сам. Я мог бы написать быстрый сценарий. Но в глубине души я верю, что мне не хватает чего-то очевидного ... есть ли уже что-то, что делает это?

FILE=/var/log/syslog
DELAY=10
BEFORE=$(wc -l ${FILE}|cut -f1 -d' ')
sleep ${DELAY}
AFTER=$(wc -l ${FILE}|cut -f1 -d' ')
echo $(($AFTER - $BEFORE))

Дает вам количество строк, добавленных за 10 секунд.

cat / var / log / myfile | while ((((index ++)% 5) == 0)) {sms / chat-session / something}

Обновить: актуальный общий рабочий код:

dmesg | while true; do  <br> 
    if  [  $((  $(( index++ )) % 5 )) -eq 0 ]; then
        nc  -p srcport --send-only hostname port    or arduino ...:P
        sms/write/chat-session/whatever; 
    fi  
done

При определенных обстоятельствах snmp может быть более полезной идеей.

Logtop может быть вам здесь полезен.

Также телезритель.

Несколько других интересные идеи здесь слишком.

С помощью wc - хорошее решение для небольших файлов, но оно не работает, когда у вас большие файлы журналов. Чтобы решить эту проблему, мы будем использовать fifo для хранения новых данных в файле и некоторых управляющих данных.

mkfifo /tmp/line_counter

Затем мы отправим в этот FIFO одну строку, содержащую один 0 символ для каждой строки файла журнала (нам не нужна полная строка). Нам нужно использовать sed здесь без буферизации (-u) для сохранения вывода в реальном времени. Это задание выполняется в фоновом режиме, чтобы оболочка оставалась доступной, поэтому мы запоминаем ее pid в файле:

tail -f -n 0 your_log_file | sed -u -e 's/.*/0/' >> /tmp/line_counter &
echo $! > /tmp/line_counter_tail_sed_pid

Затем нам понадобится своего рода таймер в FIFO, снова в фоновом режиме:

while true; do echo 1 >> /tmp/line_counter; sleep 1; done &
echo $! > /tmp/line_counter_timer

Затем, самое интересное, давайте прочитаем фифо с awk:

cat /tmp/line_counter | awk -W interactive '$0 == "0" {line++}
     $0 == "1" {count[time % (60*15)]=line; time++; printf "Time %6d: %6d lines read.\n", time, line}
     $0 == "1" && time > 60    {printf "%6d lines read in the last minute.\n",     count[(time-1) % (60*15)] - count[(time-1-60)   % (60*15)]}
     $0 == "1" && time > 60*5  {printf "%6d lines read in the last 5 minutes.\n",  count[(time-1) % (60*15)] - count[(time-1-60*5) % (60*15)]}
     $0 == "1" && time > 60*15 {printf "%6d lines read in the last 15 minutes.\n", count[(time-1) % (60*15)] - count[(time-1-60*15)% (60*15)]}'

В cat и -W interactive необходимы для борьбы с буфером.

Когда вы закончите, CTRL-C awk и:

kill $(cat /tmp/line_counter_timer)
kill $(cat /tmp/line_counter_tail_sed_pid)
rm /tmp/line_counter /tmp/line_counter_timer /tmp/line_counter_tail_sed_pid