如何测量文件(日志文件)中的新行率

如何测量文件(日志文件)中的新行率

我正在尝试获取日志文件的度量线随时间写入,理想情况下是当前速率和 1 分钟、5 分钟和 15 分钟的平均值。

我可以做这样的事情:

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

.. 好吧,我自己计算一下。我可以写一个快速脚本。但我内心深处认为,我忽略了一些显而易见的东西.. 是否已经存在可以做到这一点的东西?

答案1

洛格托普可能对你有用。

管道查看器

其他这里有有趣的想法也。

答案2

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 秒内添加的行数。

答案3

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 可能是一个更有用的想法。

答案4

对于小文件来说,使用wc是一种很好的解决方案,但是对于大日志文件来说,这种方法就行不通了。为了解决这个问题,我们将使用 fifo 来存储文件中的新数据和一些控制数据。

mkfifo /tmp/line_counter

然后,我们将向该 fifo 发送一行,其中包含0日志文件的每一行的一个字符(我们不需要完整的行)。我们需要sed在这里使用无缓冲(-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

然后,有趣的部分,让我们用以下方法读取 fifo 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-Cawk并:

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

相关内容