Logtop pode ser útil para você aqui.
Além disso, visualizador de canais .
Algumas outras ideias interessantes aqui também.
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?
Logtop pode ser útil para você aqui.
Além disso, visualizador de canais .
Algumas outras ideias interessantes aqui também.
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.
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.
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