技术控

    今日:125| 主题:49390
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] [原]awk处理nginx日志

[复制链接]
繁华落幕 发表于 2016-10-3 15:07:10
136 1

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
awk处理nginx日志

  主要是将非结构化的日志处理成结构话数据并入库做统计,本场景是统计rest接口的调用情况:
  
       
  •       nginx日志设置   
  •       awk抽取字段   
  •       awk日期格式化   
  •       拼装sql与导入数据库   
  •       crontab自动执行   
  •       配合log rotate   
  •       统计分析   
  •       邮件通知   
  •       报表展示  
  nginx日志设置

  nginx.conf中:
  1. log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  2.                   '$status $body_bytes_sent "$http_referer" '
  3.                   '$request_time $upstream_response_time $pipe'
  4.                   '"$http_user_agent" "$http_x_forwarded_for"';
  5. access_log  /var/log/nginx/access.log  main;
复制代码
awk

  抽取字段

  代码:
  1. awk '{print substr($4,2,11),substr($4,14,15),substr($6,2),$7,$12,$13}'  /var/log/nginx/access.log > ~/stat.log
  2. # 获取访问时间,请求方法,rest url,request time和response time
复制代码
日期格式化

  nginx的时间是这种格式[02/Oct/2016 04:50:11],先用date格式化的方法:
  1. awk -v A=$(date +%Y%m%d) '{gsub("/"," ",$1); sprintf("date -d "%s %s" "+%%Y-%%m-%%d %%H:%%M:%%S"", $1,$2) | getline D;printf("insert interfaceInvoke(ddate,cdate,method,url,requesttime,responsetime) values("%s","%s","%s","%s",%f,%f);\n",A,D,$3,$4,$5,$6)}' ~/stat.log > ~/stat.sql
复制代码
发现经常有too many open files错误,嵌套的date命令用掉太多文件句柄,7k条测试数据执行完成需要13s。
  考虑了一下,去掉gsub和date,由于时间字符串的格式是固定的、每一部分的长度也是固定的,全部使用字符串处理:
  1. awk -v A=$(date +%Y%m%d) 'BEGIN{ mon["Jan"] = 1; mon["Feb"] = 2; mon["Mar"] = 3; mon["Apr"] = 4; mon["May"] = 5; mon["Jun"] = 6; mon["Jul"] = 7; mon["Aug"] = 8; mon["Sep"] = 9; mon["Oct"] = 10; mon["Nov"] = 11; mon["Dec"] = 12; }; {printf("insert interfaceInvoke(ddate,cdate,method,url,requesttime,responsetime) values("%s","%s-%s-%s %s","%s","%s",%f,%f);\n",A,substr($1,8,4),mon[substr($1,4,3)],substr($1,1,2),$2 ,$3,$4,$5,$6)}' ~/stat.log > ~/stat.sql
复制代码
这样就不需要执行gsub替换和嵌套date命令,7k条测试执行时间只有0.026s,也可以文件句柄的问题了。
  invokeStat.sh全部代码如下:
  1. awk '{print substr($4,2,11),substr($4,14,15),substr($6,2),$7,$12,$13}' /var/log/nginx/access.log > ~/stat.log
  2. # insert into db
  3. awk -v A=$(date +%Y%m%d) 'BEGIN{ mon["Jan"] = 1; mon["Feb"] = 2; mon["Mar"] = 3; mon["Apr"] = 4; mon["May"] = 5; mon["Jun"] = 6; mon["Jul"] = 7; mon["Aug"] = 8; mon["Sep"] = 9; mon["Oct"] = 10; mon["Nov"] = 11; mon["Dec"] = 12; }; {printf("insert tablename(ddate,cdate,method,url,requesttime,responsetime) values("%s","%s-%s-%s %s","%s","%s",%f,%f);\n",A,substr($1,8,4),mon[substr($1,4,3)],substr($1,1,2),$2 ,$3,$4,$5,$6)}' ~/stat.log > ~/stat.sql
  4. mysql -h192.168.*.* -uXXX -pXXX dbname  < ~/stat.sql
复制代码
crontab自动执行

  /etc/crontab里,添加:
  1. 59 23 * * * root /soft/stat/invokeStat.sh
  2. # 每天晚上12点前执行一次
复制代码
配合log rotate

  /etc/logrotate.d/nginx中:
  1. /var/log/nginx/*.log {
  2.         daily
  3.         missingok
  4.         rotate 52
  5.         compress
  6.         delaycompress
  7.         notifempty
  8.         create 640 nginx adm
  9.         sharedscripts
  10.         postrotate
  11.                 [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
  12.         endscript
  13. }
复制代码
通过logrotate每天晚上切换一次日志,保证invokeStat.sh每天跑的都是最新的,而不是昨天的日志。其实也可以考虑这两个脚本合并成一个。invokeStat先执行。
  统计分析

    主要先实现调用次数统计,cat wc -l
    调用时间大于1s的统计: awk ‘{
                            13>1 ……  
          调用时间大于60s的统计: awk ‘{
                          13>60 ……  
  调用时间最长的10次统计:sort -k3nr …… | head -n 10
  crontab自动执行

  /etc/crontab里,添加:
  1. 59 23 * * * root /soft/stat/invokeStat.sh
  2. # 每天晚上12点前执行一次
复制代码
邮件通知

  先配置sendmail,然后使用mail命令:
  1. cat ~/mystat.log | mail -s "[APP]执行时间超过1s的接口统计-"$CURDATE  [email protected]
复制代码
如果发送的文件时html类型:
  1. cat ~/mystat.log | mail -s "$(echo -e "[APP]执行时间超过1s的接口统计-$CURDATE\nContent-Type: text/html;charset=utf-8")"   [email protected]
复制代码
报表展示

  todo list

  
       
  • 集合echart与sql的字段组合,统计具体接口的调用情况   
  • 跟踪接口在不同时间的响应时间   
  • 优化慢请求   
  • 增量?  
友荐云推荐




上一篇:深入浅出选择类排序算法(简单选择排序,堆排序)
下一篇:Ryan Thompson from PyroCMS: “It’s all about principles”
酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。

董婷 发表于 2016-10-24 14:08:47
怪事年年有,今年特别多!
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表手机版
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )|网站地图 酷辣虫

© 2001-2016 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表