Разбор строк в кавычках и смещения даты и времени - GROK и Logstash - PullRequest
0 голосов
/ 31 января 2020

С Grok Debuger Я пытаюсь проанализировать некоторые пользовательские данные:

1 1 "Устройство 1" 1 "Вход 1" 0 "Вкл." Выкл. "" 2020 -01-01T00: 00: 00.1124303 + 00: 00 "

Пока у меня есть:

% {INT: id}% {INT: устройство}% { QUOTEDSTRING: имя_устройства}% {INT: input}% {QUOTEDSTRING: input_name}% {INT: состояние}% {QUOTEDSTRING: on_phrase}% {QUOTEDSTRING: off_phrase} \ "% {TIMESTAMP_ISO8601: когда} \"

Тем не менее, я получаю такие вещи, как двойные кавычки вокруг строк %{QUOTEDSTRING) и два часа и минуты с указанием времени и даты %{TIMESTAMP_ISO8601:when}

{
  "id": [
    [
      "1"
    ]
  ],
  "device": [
    [
      "1"
    ]
  ],
  "device_name": [
    [
      ""Device 1""
    ]
  ],
  "input": [
    [
      "1"
    ]
  ],
  "input_name": [
    [
      ""Input 1""
    ]
  ],
  "state": [
    [
      "0"
    ]
  ],
  "on_phrase": [
    [
      ""On""
    ]
  ],
  "off_phrase": [
    [
      ""Off""
    ]
  ],
  "when": [
    [
      "2020-01-01T00:00:00.1124303+00:00"
    ]
  ],
  "YEAR": [
    [
      "2020"
    ]
  ],
  "MONTHNUM": [
    [
      "01"
    ]
  ],
  "MONTHDAY": [
    [
      "01"
    ]
  ],
  "HOUR": [
    [
      "00",
      "00"
    ]
  ],
  "MINUTE": [
    [
      "00",
      "00"
    ]
  ],
  "SECOND": [
    [
      "00.1124303"
    ]
  ],
  "ISO8601_TIMEZONE": [
    [
      "+00:00"
    ]
  ]
}

Кроме того, я немного застреваю, когда речь идет о logstash.conf, так как я не уверен, что я бы назвал index в output. Следующий код взят из предыдущего примера из github:

input {
  beats {
    port => 5044
  }
}

filter {
  grok {
    match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
  }
}

output {
  elasticsearch {
    hosts => "elasticsearch:9200"
    manage_template => false
    index => "sample-%{+YYYY.MM.dd}"
  }
}

Я предполагаю, что мой будет выглядеть примерно так:

input {
  beats {
    port => 5044
  }
}

filter {
  grok {
    match => { "message" => "%{INT:id} %{INT:device} %{QUOTEDSTRING:device_name} %{INT:input} %{QUOTEDSTRING:input_name} %{INT:state} %{QUOTEDSTRING:on_phrase} %{QUOTEDSTRING:off_phrase} \"%{TIMESTAMP_ISO8601:when}\"" }
  }
}

output {
  elasticsearch {
    hosts => "elasticsearch:9200"
    manage_template => false
    index => "sample-%{????????}"
  }
}

Опять же, мне неясно, кто я должен делать с "sample-%{????????}"

1 Ответ

1 голос
/ 31 января 2020

Что касается двойных двойных кавычек: просто используйте DATA вместо QUOTEDSTRING:

"%{DATA:device_name}"

Дублированные записи в часах и минутах поступают из часового пояса: первая запись - фактический час, вторая - один час часового пояса. То же самое для минут.

Чтобы избавиться от него, вам понадобится специальный шаблон:

"(?<when>%{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?(?<ISO8601_TIMEZONE>Z|[+-](?:2[0123]|[01]?[0-9])(?::?(?:[0-5][0-9])))?)"

(если вы вообще не заинтересованы в разборе временной метки, просто используйте DATA снова).

Итак, ваш шаблон может выглядеть следующим образом:

%{INT:id} %{INT:device} "%{DATA:device_name}" %{INT:input} "%{DATA:input_name}" %{INT:state} "%{DATA:on_phrase}" "%{DATA:off_phrase}" "(?<when>%{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?(?<ISO8601_TIMEZONE>Z|[+-](?:2[0123]|[01]?[0-9])(?::?(?:[0-5][0-9])))?)"

Что касается индекса:

  • , вы можете полностью его опустить, тогда будет использоваться стандартный по умолчанию: logstash-%{+YYYY.MM.dd}
  • вы можете использовать sample-%{+YYYY.MM.dd}, если вы хотите иметь отдельные индексы для каждого дня
  • вы можете использовать sample-, чтобы иметь только один индекс
  • вы можете использовать любую другую комбинацию из поля в вашем шаблоне индекса
...