设为首页 收藏本站
查看: 1101|回复: 0

[经验分享] ELK采集之nginx 日志高德地图出城市IP分布图

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2019-1-28 12:21:55 | 显示全部楼层 |阅读模式
  最近确实忙得像狗一样,很久没有更新博客了。今天有点空闲时间写一些相关的ELK stack的博客;本来想做成一些列,后面有时间的话再更新吧
  

  1、采用拓扑:
  
  

  角色扮演:  
  Agent:采用logstash,IP:192.168.10.7
  Redis队列: IP:192.168.10.100
  Indexer:logstash,IP:192.168.10.205
  Es+kibana:放在192.168.10.100(大的日志环境可以单独存放)
  
  说明:下面是一台日志服务器下面nginx的日志格式
  
log_format backend '$http_x_forwarded_for [$time_local] '
                   '"$host" "$request" $status $body_bytes_sent '
                   '"$http_referer" "$http_user_agent"'  

  

  1、192.168.10.7上面agnet的配置:
  
[luohui@BJ-hua-h-web-07 ~]$ cat /etc/logstash-nginx.conf
input {
    file {
        path =>["/home/data/logs/access.log"]
        type =>"nginx_access"
    }
}
output {
if [type] == "nginx_access"{
   redis {
    host =>["192.168.10.100:6379"]
    data_type=>"list"
    key =>"nginx"
    }
  }
}  
  ##说明:这里的agent只是做日志发送,对性能影响不大,读取access.log日志文件,并且发送到远端redis。
  

  2、192.168.10.205:indexer的配置:
[root@mail etc]# cat logstash_nginx.conf
input {
  redis {
    host =>"192.168.10.100"
    port => 6379
    data_type =>"list"
    key =>"nginx"
  }
}
filter {
        grok {
              match=>
                {"message" =>"%{IPORHOST:clientip} \[%{HTTPDATE:timestamp}\] %                           {NOTSPACE:http_name}\"(?:%{WORD:verb} %{NOTSPACE:request}(?:HTTP/%                       {NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response}(?:%                      {NUMBER:bytes:float}|-) %{QS:referrer} %{QS:agent}"
            }
        }
    date {
        match => ["timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
    }
    geoip {
        source =>"clientip"
        target =>"geoip"
        database =>"/test/logstash-5.0.0/GeoLite2-City.mmdb"
        add_field => ["[geoip][coordinates]", "%{[geoip][longitude]}" ]
        add_field => ["[geoip][coordinates]", "%{[geoip][latitude]}"  ]
        }
    mutate {
            convert => [ "[geoip][coordinates]", "float"]
          }
    }
output {
     elasticsearch {
      action =>"index"
      hosts=>"192.168.10.100:9200"
      index =>"logstash-nginx-%{+yyyy.MM.dd}"
      }
}  

  
  ##说明:这里接收来自:redis的数据key为nginx的。然后进行正则匹配筛选数据。
  Geoip调用我们本地下载的库,在linux版本下现在用:GeoLite2-City.mmdb,可以去网上下载。
  

  备注:基本上操作的也就是logstash的相关操作,其他都是傻瓜安装。但是记得要启动elastic监听端口,启动redis监听端口。最后面启动logstash倒入数据。
  

  这个比较简单,调用city库之后,选择Tile map即可:
  

  

  这里是kibana带的地图,可以看到是英文的城市名之类的,我们改成高德地图,显示中文城市名。
  

  3、修改kibana.yml添加如下URL:
  tilemap.url: "http://webrd02.is.autonavi.com/appmaptilelang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}"
  

  4、重启kibana即可得到如下图形:

  

  5、到这里已经差不多完成了。然后还有剩下的相关图表。大家熟悉kibana自己做聚合运算即可。
  

  6、有一些nginx喜欢用如下的默认格式:
log_format main  '$remote_addr - $remote_user[$time_local] "$request" '
                      '$status $body_bytes_sent"$http_referer" '
                      '"$http_user_agent""$http_x_forwarded_for" $request_time ';  

  

  7、可以用如下的grok,默认一些正则表达式logstash已经提供,我们可以如下地址去查看:
vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.0.2/patterns
  

  8、我们切换到这个目录下,创建相关的正则:
[root@mail etc]#cd vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.0.2/patterns
[root@mail etc]#cat nginx
NGUSERNAME [a-zA-Z\.\@\-\+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS%{IPORHOST:clientip} - %{NGUSER:remote_user} \[%{HTTPDATE:timestamp}\]\"(?:%{WORD:verb} %{NOTSPACE:request}(?:HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response}(?:%{NUMBER:bytes:float}|-) %{QS:referrer} %{QS:agent}%{NOTSPACE:http_x_forwarded_for} %{NUMBER:request_time:float}  

  9、直接调用即可:
  
[root@controller etc]# catnginx.conf
input {
  redis {
    host =>"192.168.10.100"
    port => 6379
    data_type =>"list"
    key =>"nginx"
  }
}
filter {
    grok {
        match => { "message" =>"%{NGINXACCESS}" }
    }
    date {
        match => [ "timestamp" ,"dd/MMM/YYYY:HH:mm:ss Z" ]
    }
    geoip {
      source => "clientip"
      target => "geoip"
      database =>"/test/logstash-5.0.0/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 {
       action => "index"
       hosts => "192.168.63.235:9200"
       index => "logstash-nginx-%{+yyyy.MM.dd}"
   }
}  ###到处已经可以手工了,剩下就是采集数据kibana聚合出图的事情。
  

  10、可以完善的,就是nginx我们可以再生成数据的时候以json的格式生成,这样就不用grok去解析这么消耗CPU了:
  

log_format json'{"@timestamp":"$time_iso8601",'
                '"host":"$server_addr",'
                '"clientip":"$remote_addr",'
                '"size":$body_bytes_sent,'
                '"responsetime":$request_time,'
                '"upstreamtime":"$upstream_response_time",'
                '"upstreamhost":"$upstream_addr",'
                '"http_host":"$host",'
                 '"url":"$uri",'
                '"xff":"$http_x_forwarded_for",'
                '"referer":"$http_referer",'
                '"agent":"$http_user_agent",'
                '"status":"$status"}';
access_log  /etc/nginx/logs/access.json  json;  

  11、然后我们生成的就是json格式的日志了,还有一些需求的变量可以自己添加,logstask可以修改为:
  
[root@controller logstash-5.0.0]#cat etc/nginx_json.conf
input {
  file {             #从nginx日志读入
    type => "nginx-access"
    path =>"/etc/nginx/logs/access.json"
    start_position => "beginning"
    codec => "json"  #这里指定codec格式为json
  }
}
filter {
   if [type] == "nginx-access"{
       geoip {
      source => "clientip"
      target => "geoip"
      database =>"/test/logstash-5.0.0/GeoLite2-City.mmdb"
      add_field => ["[geoip][coordinates]", "%{[geoip][longitude]}" ]
      add_field => [ "[geoip][coordinates]","%{[geoip][latitude]}"  ]
    }
   }
}
output {
    if [type] == "nginx-access" {
    stdout{codec=>rubydebug}
    elasticsearch {
        action => "index"
        hosts => "192.168.63.235:9200"
        index => "mysql-slow-%{+yyyy.MM.dd}"
     }
  }
}  


  清爽好多,手工。注意GeoLite2-City.mmdb用这个库,我之前用bat这个。是出不来图的

  

  






运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-668699-1-1.html 上篇帖子: 智能处理elk集群索引日志 下篇帖子: elk5.6.0 centos7 及问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表