#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-адресов, все прошло!