我试图获得一段时间内的日志文件行写操作,理想情况下是当前的速率和1分钟,5分钟和15分钟的平均值。
我可以做这样的事情:
watch wc -l /var/log/<my_file>
呃,自己计算一下吧。 我可以写一个快速的脚本。 但是我深信,在我的内心深处,我错过了一些显而易见的东西。是不是有这样的东西呢?
Logtop在这里可能对你有用。
也是pipe道查看器 。
其他一些有趣的想法也在这里 。
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 / whatever}
更新 :实际的一般工作代码:
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可能是一个更有用的想法。
使用wc是小文件的一个很好的解决scheme,但是当你有大的日志文件的时候它会中断。 为了解决这个问题,我们将使用fifo来存储文件中的新数据和一些控制数据。
mkfifo /tmp/line_counter
然后,我们将发送一个包含一个0字符的日志文件的每行的fifo一行(我们不需要完整的行)。 我们需要在这里使用sed unbuffered( -u )来保持输出的实时性。 这个工作放在后台来保持shell可用,所以我们记住它的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读取fifo:
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