nginx日志举例
172.16.1.1 - - [04/Feb/2015:23:40:01 +0800] "POST /api/message/query HTTP/1.1" 200 52 "-" "Apache-HttpClient/4.2 (java 1.5)" "-" "message.test.com" "172.16.3.159" "-" "0.116" "-" "0.116" "-" remote_addr_ac_logon
取出time、url、请求大小,sub(/\[/,"",$4)
去掉时间中的中括号,sub(/Feb/,"2",$4)
把Fed替换为2
awk
的sub
函数用于替换字符串,语句单独使用,如果使用赋值语句,如a=sub(/Feb/,"2",$4)
则a=1
,返回替换次数
cat message-access.log | awk ‘BEGIN {print "time,url,size"} {sub(/\[/,"",$4);sub(/Feb/,"2",$4);print $4","$7","$10}‘ > message-time.log
然后使用R语言导入这个文件,用ggplot2
画图,在R语言中通过使用ddply
函数做统计分组,ddply
的使用参见:ddply使用
但R语言做统计分组效率较低,文件大小在1G以上的时候,内存压力很大,这时使用uniq
或awk
做分组比较合适
sort
和uniq
统计分组
统计每秒请求数,并使用sed去年最终结果中的每行开头的空格
cat message-time.log | awk -F‘,‘ ‘{print $1}‘| sort -rn | uniq -c | sed ‘s/^[][ ]*//g‘> message-time-count.log
但uniq
只能统计出现次数,不能统计累加的值
awk
统计分组
每分钟请求数据包大小, group by time,sum(size),取time字段的前16个字符,去掉最后的秒:substr($1,0,16)
,在END语句中打印统计结果,把秒都置为0
cat message-time.log | awk -F"," ‘{a[substr($1,0,16)]+=$3}END{for(i in a) print i"0",a[i]}‘ > message-time-size.log
画图
加载包
library(ggplot2)
library(scales)
R语言读取文件,as.is=TRUE
字符不转factor
message = read.csv(‘e:/R/message-time-size.log‘,
as.is=TRUE,
header=FALSE,
sep = ",",
col.names=c(‘time‘,‘size‘))
转为时间类型
message$time = as.POSIXlt(strptime(message$time,"%d/%m/%Y:%H:%M:%S"))
byte转为kb
message$size<- message$size / 1024
画“时间-流量图”,x轴每1小时显示一个值,显示格式只显示小时
ggplot(message,aes(x=time,y=size)) +
geom_line() +
labs(title="时间-流量图",y=‘size(KB)‘) +
scale_x_datetime(breaks=date_breaks("1 hour"),labels= date_format("%H"))
保存图片
ggsave(filename=‘e:/R/时间-流量图-分.jpg‘,width=15,height=8)
统计url访问次数图
ggplot(message)+
geom_bar(aes(x=url)) +
coord_flip() +
labs(x=‘url‘,y=‘count‘)
饼状图
ggplot(message)+
geom_bar(aes(x=factor(1),fill=url)) +
coord_polar(theta=‘y‘) +
labs(x=‘‘,y=‘‘)
ggsave(filename=‘e:/R/url-饼状图.jpg‘)
附上一张流量图
时间: 2024-10-08 11:41:08