如何正确使用logstash条件(如果... in)?

时间:2016-10-12 07:40:39

标签: elasticsearch logstash

我在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

1 个答案:

答案 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])