这里让我们假设Web日志已经做了按天分割,如果你不清楚怎么搞,可以参考我前一段时间写的:「被遗忘的Logrotate」,日志的格式大致如下所示:
1.2.3.4 - - [25/Jul/2013:00:01:01 +0800] "GET /url HTTP/1.1" ...
查看日志格式,可知以空白为分隔符的话,第四个字段是时间,第七个字段是网址,有了这些信息,使用AWK就可以算出LUA和PHP即时的RPS大小,如果你看过我以前写的文章,应该记得我在「DevOps的三板斧」一文里列举过一个类似的案例,不过本文所说的问题相对更复杂些,所以还是写出来给大家看看,代码如下:
#!/usr/bin/awk -f function rps(data, file) { COMMAND = "sort -o " file for(time in data) { print time, "\t", data[time] | COMMAND } close(COMMAND) } { URL = $7 TIME = substr($4, 14) } URL ~ /^\/foo\/lua/ { LUA[TIME]++; next } URL ~ /^\/bar\/lua/ { LUA[TIME]++; next } { PHP[TIME]++ } END { rps(LUA, "LUA.log") rps(PHP, "PHP.log") }
说明:通过管道对AWK中的无序数组进行排序后要注意关闭管道。
计算得到的RPS文本数据格式大致如下所示:
00:00:00 115 00:00:01 85 00:00:02 95 00:00:03 85 00:00:04 90 00:00:05 87
让我们用Gnuplot把它画出来:
#!/usr/bin/gnuplot set terminal png size 500,400 set grid set xdata time set timefmt "%H:%M:%S" set format x '%H' set xlabel "Time" set ylabel "RPS" set output "rps.png" plot "LUA.log" using 1:2 with line title "LUA", \ "PHP.log" using 1:2 with line title "PHP"
最终生成的效果图大致如下所示:
看图可知,LUA接口的访问量波峰大致在晚上六点和凌晨零点,而PHP的访问量波峰大致在晚上十点左右,两者的访问量波谷基本都是在凌晨四五点左右。