Como medir a taxa de novas linhas no arquivo (arquivo de log)

6

Estou tentando obter uma medida do arquivo de log line com o tempo, idealmente uma taxa atual e médias de 1, 5 e 15 minutos.

Eu poderia fazer algo assim:

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

.. e, bem, calcule eu mesmo. Eu poderia escrever um roteiro rápido. Mas eu acredito, no fundo do meu coração, que estou perdendo algo óbvio ... já existe alguma coisa lá fora que faz isso?

    
por Maas 19.12.2012 / 16:08

4 respostas

0

Logtop pode ser útil para você aqui.

Além disso, visualizador de canais .

Algumas outras ideias interessantes aqui também.

    
por 18.03.2013 / 05:49
4
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))

Fornece uma contagem do número de linhas adicionadas em 10s.

    
por 19.12.2012 / 17:49
4

cat / var / log / myfile | while ((((index ++)% 5) == 0)) {sms / sessão de chat / qualquer outra coisa}

update : código de trabalho geral real:

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

O snmp pode ser uma ideia mais útil em determinadas circunstâncias.

    
por 19.12.2012 / 17:54
0

Usar o wc é uma boa solução em arquivos pequenos, mas é interrompido quando você tem grandes arquivos de log. Para resolver esse problema, usaremos um fifo para armazenar os novos dados no arquivo e alguns dados de controle.

mkfifo /tmp/line_counter

Em seguida, enviaremos uma única linha contendo uma única caractere 0 para cada linha do arquivo de log (não precisamos da linha completa). Precisamos usar sed unbuffered aqui ( -u ) para manter a saída em tempo real. Este trabalho é colocado em segundo plano para manter o shell disponível, então nos lembramos de seu pid em um arquivo:

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

Então, precisamos de um temporizador no fifo, novamente em segundo plano:

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

Então, a parte divertida, vamos ler o fifo com 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)]}'

Os cat e -W interactive são necessários para combater o buffer.

Quando estiver pronto, CTRL-C, o awk e:

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
    
por 20.12.2012 / 17:06