Сценарии безболезненные Kibana 6.4.2 не совпадают с использованием matcher, но сопоставляются с использованием условного выражения - PullRequest
0 голосов
/ 10 апреля 2019

Здравствуйте. Я пытаюсь получить подстроку сообщения журнала с помощью регулярных выражений в полях, написанных на языке кибана.Я столкнулся с интересным сценарием, который не складывается.Я преобразовал поле сообщения в ключевое слово, чтобы можно было выполнять над ним полевые операции со сценариями.

Когда я сопоставляю с условным выражением, таким как:

if (doc['message'].value =~ /(\b(?:\d{1,3}\.){3}\d{1,3}\b)/) { 
return "match"
} else {
return "no match"
}

Это будет соответствовать IP и возвращаться правильночто в сообщении есть ip.Однако всякий раз, когда я пытаюсь выполнить функцию соответствия, которая разбивает сопоставленный текст на подстроки, он не находит совпадений.

В соответствии с руководством по документации Elastic для этого, расположенным здесь: https://www.elastic.co/blog/using-painless-kibana-scripted-fields

Это пример сценария, который они дают для соответствия первому октету ip в сообщении журнала.Однако, это не возвращает совпадений, когда действительно есть IP-адреса в сообщении журнала.Я даже не могу сопоставить только текстовые символы, независимо от того, что я делаю, он возвращает 0 совпадений.

Я также включил rexex вasticsearch.yml в моем кластере.

def m = /^([0-9]+)\..*$/.matcher(doc['message'].value);
if ( m.matches() ) {
   return Integer.parseInt(m.group(1))
} else {
   return m.matches() + " - " + doc['message'].value;
}

Этовозвращает 0 совпадений.Даже если я использую то же выражение, что и для условного выражения:

/ (\ b (?: \ D {1,3}.) {3} \ d {1,3} \ b) /

устройство сопоставления по-прежнему будет возвращать значение false.

Любая идея о том, что я делаю не так в соответствии с документацией, должна работать.

Я пытался использовать подстроки, когда значение существует в условном условии if, но существует много различий между сообщениями журнала.Я также не вижу способа разделить и просмотреть список выходов, чтобы выбрать один с ip, если я просто использую условное поле для сценария.

Любая идея о том, как решить эту проблему:

Вот пример того, что возвращается из формы

def m = /^([0-9]+)\..*$/.matcher(doc['message'].value);
if ( m.matches() ) {
   return Integer.parseInt(m.group(1))
} else {
   return m.matches() + " - " + doc['message'].value;
}

Самое смешное, что все они возвращают false, и это, по сути, просто поиск чисел с.и я попробовал все виды регулярных выражений без удачи.

[
 {
  "_id": "VRYK_2kB0_nHZ_3qyRwt",
  "Source-IP": [
   "false - #Version: 1.0"
  ]
 },
 {
  "_id": "VhYK_2kB0_nHZ_3qyRwt",
  "Source-IP": [
   "false - 2019-02-17 00:34:11 127.0.0.1 GET /status/web - 8611 - 127.0.0.1 ELB-HealthChecker/2.0 - 200 0 0 31"
  ]
 },
 {
  "_id": "VxYK_2kB0_nHZ_3qyRwt",
  "Source-IP": [
   "false - #Software: Microsoft Internet Information Services 10.0"
  ]
 },
 {
  "_id": "WBYK_2kB0_nHZ_3qyRwt",
  "Source-IP": [
   "false - #Date: 2019-03-26 00:00:08"
  ]
 },
 {
  "_id": "WRYK_2kB0_nHZ_3qyRwt",
  "Source-IP": [
127.0.0.1 ELB-HealthChecker/2.0 - 200 0 0 15"
  ]
 },
 {

1 Ответ

0 голосов
/ 10 апреля 2019

получилось следующим:

if (doc["message"].value != null) { 
  def m = /(\b(?:\d{1,3}\.){3}\d{1,3}\b)/.matcher(doc["message"].value); 
  if (m.find()) { return m.group(1) } 
  else { return "no match" } 
} 
else { return "NULL"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...