Как использовать logstash conditionals(if…in ) правильно?

#elasticsearch #logstash

#elasticsearch #logstash

Вопрос:

У меня была проблема с условными обозначениями (особенно с if…in ) в конфигурации logstash.

Когда я использовал плагин фильтра logstash «geoip» для генерации информации о местоположении с помощью этой конфигурации:

 geoip {
  source => "ip_addr"
}
  

Я обнаружил, что некоторый IP (например: 63.149.98.170) не смог сгенерировать поле «часовой пояс» в поле «geoip», результат выглядит следующим образом:

 "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
  ]
}
  

Поле «часовой пояс» важно для отображения табличного представления, поэтому, если его невозможно сгенерировать, я бы хотел создать пустое, чтобы увидеть неполные данные в табличном представлении Kibana.

Итак, я добавляю конфигурацию после данных конфигурации geoip следующим образом:

 if !([timezone] in [geoip]) {
  mutate {
    add_field => {
      "[geoip][timezone]" => "unknown"
    }
  }
}
  

Но результаты показались неожиданными. Когда другие IP-адреса были распознаны фильтром geoip и поле «часовой пояс» было создано нормально, mutate по-прежнему добавлял «неизвестный» в поле «часовой пояс». Результат такой:

 "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 находится здесь.

Ответ №1:

Как вы сказали, "[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])

Комментарии:

1. вау, это правда! Я протестировал оба условия IP-адресов, все прошло!