Logstash + Elasticsearch实现的用户实时访
为了相对简单的实现用户访问区域实时分布图,就采用了Logstash + Elasticsearch 索引Nginx access log 实现了此功能(这里主要讲实现方法)。
优势:相对简单易实现。
劣势:相对明显,由于用户来源归属地信息,是通过用户外网IP的GEOIP库计算出来的,可能有很一小部分用户归属地不太准确(比如,除联通电信以外的ISP的外网IP)。
定制业务效果页面截图效果如下:
map1.gif
此业务效果图需要自行开发,目前使用百度EchartJS做为前段图表展示,后端使用做为Jobs实时输出归属地统计接口。
好了,说了这么多。下面我就说说相关配置方法:
1.第一步先配置nginx access 输出日志格式
#nginx.conf
log_format main '$server_name $realip $remote_addr $remote_port "$http_x_forwarded_for" $remote_user [$time_local] "$request" '
'$status $body_bytes_sent $content_length "$http_referer" '
'"$http_user_agent" $request_time $upstream_response_time $cookie_xotoken $cookie_UM "$http_cookie" $proxy_host $upstream_addr $upstream_cache_status';
2.配置logstash
安装geoip插件
/usr/share/logstash/bin/logstash-plugin install logstash-filter-geoip
下载最新的GEOIP库
cd /etc/logstash/ && wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz && tar xf GeoLite2-City.tar.gz&&mv GeoLite2-City*/GeoLite2-City.mmdb
logstash规则配置(各位看官请根据自己的日志格式做出相应修改):
input {
file {
path => "/data/logs/nginx/nginx.access.log"
}
}
filter {
grok {
patterns_dir => "/etc/logstash/conf.d/patterns"
match => {
message => '%{HOSTNAME:hostname} %{IPV4:realip} %{IPV4:remote_ip} %{BASE10NUM:source_port} "%{DATA:xforwarded_for .*}" %{NGUSER:userauth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" (?:%{NUMBER:request_status}|-) (?:%{NUMBER:body_bytes_sent}|-) (?:%{NUMBER:content_length}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer}) (%{QS:user_agent}) (%{NUMBER:request_time}|-) (%{NUMBER:upstream_response_time}|-) (%{DATA:wowoohruserid .*}|-) (%{DATA:um_distinctid .*}|-) "(%{DATA:cookies .*}|-)"'
}
}
date {
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss +0800"]
target => "@timestamp"
timezone => "Asia/Shanghai"
"locale" => "en"
}
geoip {
source => "realip"
target => "geoip"
database => "/etc/logstash/GeoLite2-City.mmdb"
}
}
output {
elasticsearch {
hosts => "10.1.1.1"
index => "nginxlog-%{+YYYY.MM.dd}"
}
}
3.ES查询以及数据整合方法
ES设置text允许索引:
{"properties": {"geoip.region_name": {"type":"text","fielddata":'true'}}}
ES聚合查询语句:
{"aggs": {"group_by_name": {"terms": {"field": "geoip.region_name.keyword",'size':'50'}}},"size": 0}
在设置以上查询之后,需自行开发Api Jobs接口实时吐数据给前端页面进行展示。
前端页面使用angularjs+echart开发(较复杂就不在这赘述,可根据自己项目实现展示),实现动态前后端分离接口数据请求。