博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ELK采集之nginx 日志高德地图出城市IP分布图
阅读量:7210 次
发布时间:2019-06-29

本文共 5235 字,大约阅读时间需要 17 分钟。

最近确实忙得像狗一样,很久没有更新博客了。今天有点空闲时间写一些相关的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的日志格式

 

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即可:


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


3、修改kibana.yml添加如下URL:

tilemap.url: "

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

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,如需转载请自行联系原作者
你可能感兴趣的文章
滴滴进入寒冬期,将裁员2000人
查看>>
被批伪开源!刚刚融资6千万美元的Redis怎么了?
查看>>
专访刘刚:360手机卫士的性能监控与优化
查看>>
去哪儿网消息队列设计与实现
查看>>
MySQL 5.7中的更多改进,包括计算列
查看>>
书评与访谈:Scrum for Managers
查看>>
借助Unity AR Foundation构建跨平台AR应用
查看>>
《The Coaching Booster》问与答
查看>>
独立云计算服务商的多维实践之道:用户需求驱动变革
查看>>
JavaMail邮件发送不成功的那些坑人情况及分析说明
查看>>
GitHub Checks API帮助应用实现进一步的持续集成
查看>>
庖丁解牛迭代器,聊聊那些藏在幕后的秘密
查看>>
勇敢的交流者在敏捷组织中的重要性
查看>>
Android Pie提供了自适应供电、神经网络API 1.1等新特性
查看>>
蓝云公布2019云生态战略,如何解决企业上云关键问题?
查看>>
FaaS、PaaS和无服务器体系结构的优势
查看>>
Ceylon语言加入Eclipse基金会
查看>>
一文盘点MWC 2019所有5G设备和研发进展
查看>>
【leetcode】85. Maximal Rectangle 0/1矩阵的最大全1子矩阵
查看>>
网站真分页js代码该怎么写?
查看>>