我已经使用logstash解析了一个日志文件并将其放入elasticsearch中。我有一个名为IP的字段,现在它被映射为字符串。我想将elasticsearch中的现有映射转换为geoip而不再运行logstash。我在这个领域的elasticsearch中有几百万条记录。我想在所有记录中将IP从字符串映射转换为geoip。
答案 0 :(得分:3)
我担心你仍然需要使用Logstash,因为geoip
是一个Logstash过滤器,Elasticsearch本身无法访问GeoIP数据库。
不用担心,您不需要在原始日志行上重新运行Logstash,只需使用elasticsearch
input插件和elasticsearch
output插件重新编制ES文档索引即可通过在{between}之间添加geoip
filter来将IP
字段转换为geoip
字段。
由于您无法修改当前IP
字段从string
到geo_point
的映射,因此我们需要确保您的索引已准备好接收GeoIP数据。如果索引已在映射中包含geoip
字段(由Logstash使用其预定义的标准logstash-*
模板创建),请首先使用以下命令进行检查。
curl -XGET localhost:9200/logstash-xyz/_mapping
如果您在上述命令的输出中看到geoip
字段,那么您很高兴。否则,我们首先需要创建类型为geoip
的<{1}}字段:
geo_point
现在您的映射已准备好接收GeoIP数据。接下来,我们创建一个名为curl -XPUT localhost:9200/logstash-xyz/_mapping/your_type -d '{
"your_type": {
"properties": {
"geoip": {
"type": "object",
"dynamic": true,
"properties": {
"ip": {
"type": "ip",
"doc_values": true
},
"location": {
"type": "geo_point",
"doc_values": true
},
"latitude": {
"type": "float",
"doc_values": true
},
"longitude": {
"type": "float",
"doc_values": true
}
}
}
}
}
}'
的Logstash配置文件,如下所示:
geoip.conf
然后在设置正确的值(主机+索引)后,您可以使用input {
elasticsearch {
hosts => "localhost:9200"
index => "logstash-xyz"
}
}
filter {
mutate {
remove_field => [ "@version", "@timestamp" ]
}
geoip {
source => "IP" <--- the field containing the IP string
}
}
output {
elasticsearch {
host => "localhost"
port => 9200
protocol => "http"
manage_template => false
index => "logstash-xyz"
document_id => "%{id}"
workers => 1
}
}
运行它。运行此文件后,您的文档应包含一个名为bin/logstash -f geoip.conf
的新字段,其中包含GeoIP信息。
我建议您直接将geoip
过滤器添加到正常的logstash配置中。