使用ELK分析Nginx日志实践

安装好ELK后,可以分析Nginx的日志查看访问量,甚至可以根据ip地址解析出GPS信息,最后生成用户访问热力图,本文是基于ELK 5.6.3版本。

1.配置Nginx日志的Logstash文件

在logstash的config目录下

vim logstash.conf

添加:

input {
        file {
                path => ["/data/log/nginx/www_access.log"]
        }
}
filter {
        grok {
                match => { "message" => "%{IPORHOST:clientip} - - \[%{HTTPDATE:time}\] \"%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:http_status_code} %{NUMBER:bytes} \"%{GREEDYDATA:referrer}\" \"%{GREEDYDATA:agent}\" \"%{GREEDYDATA:xforwardedfor}\""}
        }
        geoip {
                source => "clientip"
                        target => "geoip"
                        # fields => ["city_name", "continent_code", "country_code2", "country_code3", "country_name", "ip", "latitude", "longitude", "postal_code", "region_name", "timezone"]
                        database => "/data/src/logstash/GeoLite2-City_20171107/GeoLite2-City.mmdb"
                        add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
                        add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}"  ]
        }
        mutate {
                convert => [ "[geoip][coordinates]", "float"]
        }
}
output {
        stdout { codec => rubydebug }
        elasticsearch {
                hosts  => "127.0.0.1:9200"
                        index  => "logstash-nginx-%{+YYYY.MM.dd}"
        }
}

重点说明:

以上的配置中input下的file是Nginx的access文件。

下面filter的grok的match里的规则对应的是Nginx默认配置的日志格式,一般来说Nginx的配置文件里access日志后面加上main,下面的geoip是用来将IP地址解析成GPS信息,database是在 https://dev.maxmind.com/geoip/geoip2/geolite2/ 下载的,选择的是GeoLite2 City MaxMind DB binary gzipped,解压后将数据库mmdb格式的地址写入。

最后的output里将elasticsearch的地址写入,值得注意的是index一定要logstash打头,否则后面使用Kibana做用户访问热力图的时候会报错“No Compatible Fields: The “[nginx-access-]YYYY-MM-dd” index pattern does not contain any of the following field types: geo_point”,原因是索引格式为[nginx-access-]YYYY-MM-dd的日志文件由logstash输出到Elasticsearch;在Elasticsearch中,所有的数据都有一个类型,什么样的类型,就可以在其上做一些对应类型的特殊操作。geo信息中的location字段是经纬度,我们需要使用经纬度来定位地理位置;在Elasticsearch中,对于经纬度来说,要想使用Elasticsearch提供的地理位置查询相关的功能,就需要构造一个结构,并且将其类型属性设置为geo_point,此错误明显是由于我们的geo的location字段类型不是geo_point。

2.Kibana配置Index Patterns

到Kibana选择Management->选择Index Patterns->点击Create Index Pattern按钮->在Index pattern的输入框输入logstash-nginx-*

3.Kibana配置地图

Visualize->New->选择Maps下的Coordinate Map->选择刚刚配置的logstash-nginx-*->点击Geo Coordinates->Field选择geoip.location->点击“播放键”apply changes

最后结果:

 

Tonitech版权所有 | 转载请注明出处: http://www.tonitech.com/2517.html

发表评论