ELK收集nginx日志并展示来源IP地图

修改Nginx配置文件

# 修改日志模式
 # json 为规则名字 escape=json 设置日志文件格式为json
 log_format json escape=json '{"@timestamp":"$time_iso8601",'
                             '"domain":"$host",'
                             '"host":"$server_addr",'
                             '"clientip":"$remote_addr",'
                             '"remote_user":"$remote_user",'
                             '"request":"$request",'
                             '"request_method":"$request_method",'
                             '"uri":"$uri",'
                             '"request_time":"$request_time",'
                             '"status":"$status",'
                             '"http_referrer":"$http_referer",'
                             '"body_bytes_sent":"$body_bytes_sent",'
                             '"xff":"$http_x_forwarded_for",'
                             '"http_user_agent":"$http_user_agent",'
                             '"upstream_addr":"$upstream_addr",'
                             '"upstream_response_time":"$upstream_response_time"}';
 # 将上方的规则名称写到最后
 access_log /var/log/nginx/access.log json;

添加高德地图

1.编辑kibana配置文件kibana.yml,最后面添加

# 默认情况下kibana使用"Elastic Maps Service"显示地图模块,要使用其他服务提供商的模块可以通过修改"map.tilemap.url"实现,下面是修改为高德地图
 map.tilemap.url: 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}'

配置logstash

Github:GeoLite2-Database

# 进入工作目录
cd /opt
# 下载GeoLite2数据库
wget https://raw.githubusercontent.com/texnikru/GeoLite2-Database/master/GeoLite2-City.mmdb.gz
# 解压文件
gunzip GeoLite2-City.mmdb.gz
# 将GeoLite2移动到logstash目录下
mv GeoLite2-City.mmdb /usr/local/elk/logstash/config/
# 修改logstash配置文件
vim /usr/local/elk/logstash/default.conf
​
# 监听5044端口作为输入
input {
 beats {
   port => "5044"
 }
}
# 数据过滤
filter {
 json {
   source => "message"
    remove_field => [ "message" ]
   #删除重复的message收集。
 }
 mutate {
     split => { "request" => " " }
 }
 mutate {
   add_field => {
  "httpversion" => "%{[request][2]}"
   }
 }
 mutate {                           #这里应该是选取xff,这里没有可以删掉,
     split => { "xff" => "," }
 }
 mutate {
   add_field => {
        "realip" => "%{[xff][0]}"
   }
 }
 geoip {
    source => "clientip"
    target => "geoip"
    #填写自己的GeoLite2数据库目录
     database => "/usr/local/elk/logstash/config/GeoLite2-City.mmdb"
    #获取经纬度
    add_field => ["[geoip][coordinates]","%{[geoip][longitude]}"]
    add_field => ["[geoip][coordinates]","%{[geoip][latitude]}"]
 }
 mutate {
   convert => [ "[geoip][coordinates]", "float" ]
 }​
}
# 这是ElasticSerach服务的监听端口
output {
 elasticsearch {
   hosts => ["192.168.10.129:9200"]
   index =>  "nginx-%{+YYYY.MM.dd}"
   #根据项目名称动态创建索引
 }
}

geoip

geoip 是 object 类型,它有几个子字段,含义如下:

  • geoip.city_name:城市
  • geoip.continent_name:大陆名称
  • geoip.country_iso_code:国家编码
  • geoip.location:经纬度坐标,必须是:geo_point 类型
  • geoip.region_iso_code:地域编码
  • geoip.region_name:地域名称

扩展程序是谷歌的ElasticSearch Head

# 创建一个名为geoip的模板
http://192.168.10.129:9200/_template/geoip/

# index_patterns:索引名称
#  ignore_malformed 如果true,格式错误的地理位置被忽略。如果false(默认),格式错误的地理位置引发异常并拒绝整个文档
此字段需要配置成true,以防地理格式错误导致文档被拒绝

{
  "index_patterns": [
    "nginx*"
  ],
  "order": 10,
  "mappings": {
    "properties": {
      "clientip": {
        "type": "ip"
      },
      "geoip": {
        "dynamic": true,
        "type": "object",
        "properties": {
          "location": {
            "type": "geo_point",
            "ignore_malformed": "true"
          },
          "coordinates": {
            "type": "geo_point",
            "ignore_malformed": "true"
          },
          "ip": {
            "type": "ip"
          }
        }
      }
    }
  },
  "aliases": {
    "nginx": {}
  }
}

以下就代表模板创建成功

Kibana加载地图

版权声明:
作者:江霁月
链接:https://www.jiangjiyue.com/maintenance/elk/480.html
来源:江霁月的私人小屋
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
< <上一篇
下一篇>>
文章目录
关闭
目 录