ELK采集之nginx 日志高德地图出城市IP分布图

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

最近确实忙得像狗一样,很久没有更新博客了。今天有点空闲时间写一些相关的ELK stack的博客;本来想做成一些列,后面有时间的话再更新吧


1、采用拓扑:

wKioL1h3EzSSua9CAAArIrLMEjE551.png


角色扮演: 

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的日志格式

 

1
2
3
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的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[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的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[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即可:

wKioL1h3FIyC1YLzAAFzrFYMC_A169.png-wh_50


这里是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即可得到如下图形:

wKiom1h3FUjD0xbXAAKugZ2W72o406.png-wh_50


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


6、有一些nginx喜欢用如下的默认格式:

1
2
3
  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、我们切换到这个目录下,创建相关的正则:

1
2
3
4
5
[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、直接调用即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[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了:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
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可以修改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[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这个。是出不来图的











本文转自 小罗ge11 51CTO博客,原文链接:http://blog.51cto.com/xiaoluoge/1891366,如需转载请自行联系原作者
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
29天前
|
存储 JSON 应用服务中间件
Higress的日志收集中,底层用的是Envoy,可不可以实现类似NGINX的rsyslog发送?
【2月更文挑战第30天】Higress的日志收集中,底层用的是Envoy,可不可以实现类似NGINX的rsyslog发送?
15 2
|
2月前
|
存储 监控 数据可视化
日志分析对决:揭示 ELK 与 GrayLog 的优势和差异
日志分析对决:揭示 ELK 与 GrayLog 的优势和差异
220 0
|
8天前
|
消息中间件 存储 运维
更优性能与性价比,从自建 ELK 迁移到 SLS 开始
本文介绍了 SLS 基本能力,并和开源自建 ELK 做了对比,可以看到 SLS 相比开源 ELK 有较大优势。
54269 3
|
11天前
|
运维 监控 应用服务中间件
LNMP详解(十四)——Nginx日志详解
LNMP详解(十四)——Nginx日志详解
16 2
|
1月前
|
域名解析 网络协议 应用服务中间件
nginx-ingress通过ipv6暴露服务,并在nginx ingress日志中记录客户端真实ipv6的ip地址
本文主要通过阿里云提供的clb和nlb来实现,建议是提前创建好双栈的vpc和vsw(使用clb可以不用双栈vpc和vsw)
175 1
|
2月前
|
Linux Perl
sed提取日志中的IP地址
sed提取日志中的IP地址
60 4
|
2月前
|
存储 监控 关系型数据库
ELK架构监控MySQL慢日志
ELK架构监控MySQL慢日志
|
3月前
|
网络安全 数据安全/隐私保护
使用rsync+nxlog同步+采集应用日志并接入到GrayLog5.1【优化篇】
使用rsync+nxlog同步+采集应用日志并接入到GrayLog5.1【优化篇】
28 0
|
3月前
|
JSON NoSQL 网络安全
业务服务器免装插件,使用rsync+nxlog同步+采集应用日志并接入到GrayLog5.1
业务服务器免装插件,使用rsync+nxlog同步+采集应用日志并接入到GrayLog5.1
39 0
|
16天前
|
Java
使用Java代码打印log日志
使用Java代码打印log日志
73 1