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"
}
Contents