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开发(较复杂就不在这赘述,可根据自己项目实现展示),实现动态前后端分离接口数据请求。

你可能感兴趣的:(Logstash + Elasticsearch实现的用户实时访问情况区域分布图)