R语言-分析nginx日志

自古美人都是妖i 提交于 2019-11-27 03:09:25

R语言分析nginx日志

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
awksub函数用于替换字符串,语句单独使用,如果使用赋值语句,如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以上的时候,内存压力很大,这时使用uniqawk做分组比较合适

sortuniq统计分组

统计每秒请求数,并使用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')

附上一张流量图
时间-流量图
url请求次数图


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!