Logstash配置
Logstash配置文件,添加geoip解析请求的IP地址
# 把需要解析的字段加入geoip的source中
cat > /etc/logstash/conf.d/redis_grok_geoip.conf << 'EOF'
input {
redis {
host => "172.16.49.130"
port =>"6379"
db => "0"
key => "nginx-access"
data_type => "list"
}
}
filter {
grok {
match => { "message" => "%{IP:client_ip} - - \[%{HTTPDATE:access_time}\] \"%{DATA:method} %{DATA:URL} %{DATA:http}\" %{NUMBER:status_code:long} %{NUMBER:response_bytes:long} \"(-|%{DATA:referrer})\" \"(-|%{DATA:user_agent})\" \"(-|%{IP:x_forwarded})\"" }
remove_field => ["message"]
}
geoip {
source => "client_ip"
}
}
output {
stdout {}
elasticsearch {
hosts => "http://172.16.49.130:9200"
manage_template => false
index =>"nginx-access-%{+yyyy.MM}"
}
}
EOF
启动查看解析数据
# 使用ab压测工具生成日志信息
ab -c 10 -n 1000 http://172.16.49.130/google/
# 如果访问的地址是内网地址,自行将日志内的访问IP改为公网地址
# 启动logstash,此时可以看到已经将日志解析,而且IP字段解析出了国家代码地理坐标等信息
[root@002 ~]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/redis_grok_geoip.conf
......
"status_code" => "200",
"method" => "GET",
"geoip" => {
"country_code3" => "US",
"latitude" => 37.751,
"longitude" => -97.822,
"country_code2" => "US",
"continent_code" => "NA",
"location" => {
"lon" => -97.822,
"lat" => 37.751
},
"timezone" => "America/Chicago",
"ip" => "15.117.17.153",
"country_name" => "United States"
},
......
以上转换出地理坐标等都没有问题,但是添加到Kibana的图表中类型没有转换成地理坐标的类型,无法识别。所以需要自己手动映射索引。
Kibana绘制地址位置图
创建索引映射
ES删除掉之前的索引,Kibana也清除这个索引。
进入控制台在Console使用API创建新的索引,自己手动映射地理位置字段
PUT /nginx-access-2024.05
POST /nginx-access-2024.05/_mapping
{
"properties": {
"geoip": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
}
执行PUT创建索引
鼠标点到那行点执行
执行POST映射
此时ES中已经创建好索引并且映射完成,但是还没有数据。
访问信息
# 使用ab压测工具生成日志,IP如果是内网手动修改日志为公网。
# 或者可以使用echo命令直接追加日志
[root@002 nginx]# echo '18.117.17.153 - - [23/May/2024:17:50:23 +0800] "GET / HTTP/1.0" 200 615 "-" "ApacheBench/2.3" "-"' >> access.log
Kibana添加索引
注意:此时添加完索引,type已经变成geo_point,而不是string或number。
图表展示
控制台Hone -> Maps -> Add layer -> Documents