我在logstash配置中遇到了有关条件(特别是if ... in)的问题。
当我使用logstash过滤器插件“geoip”通过此配置生成位置信息时:
geoip {
source => "ip_addr"
}
我发现某些IP(例如:63.149.98.170)无法在“geoip”字段中生成“timezone”字段,结果如下:
"geoip": {
"ip": "63.149.98.170",
"country_code2": "US",
"country_code3": "USA",
"country_name": "United States",
"continent_code": "NA",
"latitude": 38,
"longitude": -97,
"dma_code": 0,
"area_code": 0,
"location": [
-97,
38
]
}
“timezone”字段对我来说显示一个表视图非常重要,所以如果无法生成,我想创建一个空字段,以便在Kibana表视图中看到不完整的数据。
所以,我在geoip配置数据之后添加一个配置,如下所示:
if !([timezone] in [geoip]) {
mutate {
add_field => {
"[geoip][timezone]" => "unknown"
}
}
}
但结果似乎出人意料。当geoip过滤器识别出其他IP并且正常创建“timezone”字段时,mutate仍然将“unknown”添加到“timezone”字段。结果如下:
"geoip": {
"ip": "125.69.76.30",
"country_code2": "CN",
"country_code3": "CHN",
"country_name": "China",
"continent_code": "AS",
"region_name": "32",
"city_name": "Chengdu",
"latitude": 30.66669999999999,
"longitude": 104.06670000000003,
"timezone": [
"Asia/Chongqing",
"unknown" <-----look at this, "unknown" append to timezone field
],
"real_region_name": "Sichuan",
"location": [
104.06670000000003,
30.66669999999999
]
}
但在我删除“!”之后符号
if ([timezone] in [geoip])
“未知”未附加到“时区”,换句话说,“if ... in”条件未被跳入。
那么,我的配置有什么问题? 谢谢大家的帮助!
正式的logstash配置链接是here。
答案 0 :(得分:0)
正如您所说,"[geoip][timezone]" => "unknown"
已添加到所有事件中。
意味着if !([timezone] in [geoip])
存在问题。我想这会检查字段timezone
(不是geoip.timezone
)是否与字段geoip
具有相同的值。因此,[timezone] in [geoip]
测试始终评估为false,因此所有事件都会获得"[geoip][timezone]" => "unknown"
。
要测试某个字段是否不存在,根据链接的文档,您可以使用:
if !([field])
表达式if [foo]在以下时间返回false:
- [foo]在活动中不存在,
因此,在您的情况下,您必须将if !([timezone] in [geoip])
替换为if !([geoip][timezone])