Получение ошибки синтаксического анализа журнала logstash: grokparsefailure

Я пытаюсь интегрировать logstash в наше приложение, где я включаю следующий фрагмент шаблона в файл custompattern.

Path: <path>/custom_pattern -- This is custom pattern file. I include this path in conf.
Content: ACCESSLOGPARSE \[%{HTTPDATE:timestamp}\] %{IPORHOST:clientip} (?: xff=%{IPORHOST:xffIp})

Мой файл конфигурации logstash:

input { 
  file{
    path => "/tmp/jboss-logs.log"
    start_position => beginning
  }
}

filter {
  if [path] =~ "jboss" {
    mutate { replace => { "type" => "jboss_access"}}
  grok {
    patterns_dir => "<dir path>"
    match => { "message" => "%{ACCESSLOGPARSE}" }
    }
  }
  date {
    match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
  }
}
output {
  elasticsearch { host => localhost }
  stdout { codec => rubydebug }
}

Содержимое моего файла jboss-logs.log:

[09/Jan/2015:00:00:02 +0000] 127.0.0.1 xff=-
[09/Jan/2015:00:10:17 +0000] 100.20.10.11 xff=100.40.11.3

Когда я запускаю logstash, я получаю следующий вывод, в котором журнал не анализируется.

{
       "message" => "[09/Jan/2015:00:00:02 +0000] 127.0.0.1 xff=-",
      "@version" => "1",
    "@timestamp" => "2015-01-20T15:30:10.865Z",
          "host" => "Salvador",
          "path" => "/tmp/jboss-logs.log",
          "type" => "jboss_access",
          "tags" => [
        [0] "_grokparsefailure"
    ]
}
{
       "message" => "[09/Jan/2015:00:10:17 +0000] 100.20.10.11 xff=100.40.11.3",
      "@version" => "1",
    "@timestamp" => "2015-01-20T15:30:10.869Z",
          "host" => "Salvador",
          "path" => "/tmp/jboss-logs.log",
          "type" => "jboss_access",
          "tags" => [
        [0] "_grokparsefailure"
    ]
}

Проблема в том, что ключ «xff» в журнале может содержать ip или «-». Я тоже пробовал со следующими шаблонами. Но они тоже не работали.

ACCESSLOGPARSE \[%{HTTPDATE:timestamp}\] %{IPORHOST:clientip} (?: xff=%{IPORHOST:xffIp}|-) 
and
ACCESSLOGPARSE \[%{HTTPDATE:timestamp}\] %{IPORHOST:clientip} (?: xff=%{IPORHOST:xffIp}|xff=-)

Что не так с парсером для этого шаблона?


person svjn    schedule 20.01.2015    source источник


Ответы (1)


Ваш первый шаблон использует только IPORHOST, который не поддерживает «-» в качестве допустимого значения.

Ваш второй шаблон (?: xff=%{IPORHOST:xffIp}|-) ищет "xff=1.2.3.4" или "-". Ваш ввод "xff=-", что не соответствует.

Также обратите внимание, что пробел после "(?:" является значительным и должен быть удален.

Эти работы:

xff=(?:%{IPORHOST:xffIp}|-)

(но xffIp будет NULL, когда значение равно "-")

Используйте более общий шаблон:

(?:xff=%{НЕПРОБЕЛ:xffIp})

или вы можете определить новый шаблон:

ИПОРХОСТОРДАШ (?:%{ИПОРХОСТ}|-)

и используйте его:

(?:xff=%{IPORHOSTORDASH:xffIp})

чтобы поместить проанализированное значение в поле xffIP.

Если в вашей строке больше полей ключ/значение, вам следует изучить фильтр kv{}.

person Alain Collins    schedule 20.01.2015
comment
Спасибо. Ваше решение сработало. Но только после того, как я оставил место рядом с (?: У вас есть идеи, почему это так? И вы не поделитесь со мной ссылкой, где я могу полностью изучить эти создания шаблонов? Я искал его и не смог найти подходящего . - person svjn; 21.01.2015
comment
Там нет места, чтобы полностью узнать что-либо об ELK. Вы должны подобрать фрагменты здесь, в блогах, в IRC и т. д. Для шаблонов вам лучше всего подойдет либо исходный код (github.com/elasticsearch/logstash/tree/v1.4.2/patterns) или на вкладке шаблонов в отладчике (grokdebug.herokuapp.com) - person Alain Collins; 21.01.2015