Contents
最近在玩elk,虽然没有自己搭建环境,但在配置收集log方面也有一些小心得值得记录一下。
今天先记录一下这个,就是把access log里面http_user_agent字段中关于手机型号的信息分离出来,新增一个字段。
首先,为了把nginx的access log导入elk,已经对其格式进行了json化:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| { "@timestamp": "2016-08-15T09:58:54+08:00", "remote_addr": "117.25.139.53", "remote_user": "-", "body_bytes_sent": 87, "request_time": 0.089, "status": "200", "request": "POST /index.html", "request_method": "POST", "http_referrer": "http://www.lstop.pub/index.html", "http_x_forwarded_for": "125.93.83.94", "http_x_real_ip": "125.93.83.94", "bytes_sent": 256, "upstream_response_time": 0.089, "http_user_agent": "Mozilla/5.0 (Linux; Android 5.1; OPPO R9tm Build/LMY47I) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile MQQBrowser/6.2 TBS/036555 Safari/537.36 MicroMessenger/6.3.23.840 NetType/WIFI Language/zh_CN" }
|
可以看到,如果访问的客户端是手机的话,user agent是这么一大串
“http_user_agent”: “Mozilla/5.0 (Linux; Android 5.1; OPPO R9tm Build/LMY47I) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile MQQBrowser/6.2 TBS/036555 Safari/537.36 MicroMessenger/6.3.23.840 NetType/WIFI Language/zh_CN”
我们要的是这些
Android 5.1; OPPO R9tm Build/LMY47I
总体思路是用sed,截取需要的信息,在json文档添加一个新字段phoneType
截取信息正则表达式当然是首选,一开始写了这个单纯的正则式
Android或iPhone OS开头,到第一个”)”,不包括”)”,测试完美匹配。
1
| (Android|iPhone OS).+?(?=\))
|
坑爹的事开始来了,sed不支持懒惰匹配。。那零宽断言也没用了。。
好吧,变成简单的,这个残缺美。。
1
| (Android|iPhone OS).+AppleWebKit
|
丑了点,关键能用,匹配出来了
Android 5.1; OPPO R9tm Build/LMY47I) AppleWebKit
好,坑爹之二,圆括号太多,正则式的圆括号在sed命令死活写不正确,干脆分两条了
进一步丑
1 2
| Android.+AppleWebKit iPhone.+AppleWebKit
|
经过两个坑后,可以进行下一步
因为是新增一个phoneType字段,就要重新组装access log。
使用sed的圆括号特性:
1
| "s/(^.*)(regexp)(.*)(\}$)/\1\2\3\2\4/g"
|
最终命令
1
| tail -F /var/log/nginx/access_www_weixiao100.log|sed -r -e "s/: -/: 0/g" -e "s/(^.*)(Android.+ AppleWebKit)(.*)(\}$)/\1\2\3,\"phoneType\":\"\2\"\4/g" -e "s/(^.*)(iPhone.+ AppleWebKit)(.*)(\}$)/\1\2\3,\"phoneType\":\"\2\"\4/g" | sudo filebeat.sh -c /etc/filebeat/filebeat-nginx.yml &
|
结果长这样,可以很好的导入elk,对手机型号进行一些分析统计了!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| { "@timestamp": "2016-08-15T10:23:53+08:00", "remote_addr": "117.25.139.52", "remote_user": "-", "body_bytes_sent": 6550, "request_time": 0.004, "status": "200", "request": "GET /index.html HTTP/1.1", "request_method": "GET", "http_referrer": "http://www.lstop.pub/index.html", "http_x_forwarded_for": "117.136.53.193", "http_x_real_ip": "117.136.53.193", "bytes_sent": 6817, "upstream_response_time": 0.004, "http_user_agent": "Mozilla/5.0 (Linux; Android 4.2.2; 2014011 Build/HM2014011) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile MQQBrowser/6.2 TBS/036519 Safari/537.36 MicroMessenger/6.3.22.821 NetType/cmnet Language/zh_CN", "phoneType": "Android 4.2.2; 2014011 Build/HM2014011) AppleWebKit" }
|