_grokparsefailure Тег во всех проанализированных журналах с несколькими фильтрами Grok

Я пытаюсь разобрать журнал minecraft с помощью Elastic Stack, и я столкнулся с очень странной проблемой (вероятно, странной для меня!)

все строки моего журнала обрабатываются правильно, но у меня есть тег _grokparsefailure в каждом из них.

моя конфигурация конвейера logstash такова:

input {
  file {
    path => [ "/path/to/my/log" ]
    #start_position => "beginning"
    tags => ["minecraft"]
  }
}

filter {
  if "minecraft" in [tags] {

#    mutate {
#      gsub => [
#        "message", "\\n", ""
#      ]
#    }



    #############################
    #           Num 1           #
    #############################
    grok {
      match => [ "message", "\[%{TIME:timestamp}] \[(?<originator>[^\/]+)?/%{LOGLEVEL:level}]: %{GREEDYDATA:message}" ]
      overwrite => [ "message" ]
      break_on_match => false
    }


    #############################
    #           Num 2           #
    #############################
    grok {
      match => [ "message", "UUID of player %{USERNAME} is %{UUID}" ]
      add_tag => [ "player", "uuid" ]
      break_on_match => true
    }


    #############################
    #           Num 3           #
    #############################
    grok {
      match => [ "message",  "\A(?<player>[a-zA-Z0-9_]+)\[/%{IPV4:ip_address}:%{POSINT}\] logged in with entity id %{POSINT:entity_id} at \(\[(?<world>[a-zA-Z]+)\](?<pos>[^\)]+)\)\Z" ]
      add_tag => [ "player", "join" ]
      break_on_match => true
    }
#
#    grok {
#      match => [ "message",  "^(?<player>[a-zA-Z0-9_]+) has just earned the achievement \[(?<achievement>[^\[]+)\]$" ]
#      add_tag => [ "player", "achievement" ]
#    }
#
#    grok {
#      match => [ "message", "^(?<player>[a-zA-Z0-9_]+) left the game$" ]
#      add_tag => [ "player", "part" ]
#    }
#
#    grok {
#      match => [ "message", "^<(?<player>[a-zA-Z0-9_]+)> .*$" ]
#      add_tag => [ "player", "chat" ]
#    }
  }
}

output {
        elasticsearch {
                hosts => ["elasticsearch:xxxx"]
                user => "xxxx"
                password => "xxxxxx"
        index => "minecraft_s1v15_%{+YYYY.MM.dd}"
        }
}

И ОБРАЗЕЦ МОЕГО ЖУРНАЛА:

[11:21:46] [User Authenticator #7/INFO]: UUID of player MyAwsomeUsername is d800b63e-c2d2-3140-83a7-32315d09feca
[11:21:46] [Server thread/INFO]: MyAwsomeUsername joined the game
[11:21:46] [Server thread/INFO]: MyAwsomeUsername[/111.111.111.111:45140] logged in with entity id 6868 at ([world]61.45686149445207, 70.9375, -175.44700729217607)
[11:21:49] [Server thread/INFO]: MyAwsomeUsername issued server command: //efererg
[11:21:52] [Async Chat Thread - #1/INFO]: <MyAwsomeUsername> egerg
[11:21:54] [Async Chat Thread - #1/INFO]: <MyAwsomeUsername> ef
[12:00:19] [Server thread/INFO]: MyAwsomeUsername lost connection: Disconnected
[12:00:19] [Server thread/INFO]: MyAwsomeUsername left the game
[12:00:21] [User Authenticator #8/INFO]: UUID of player MyAwsomeUsername is d800b63e-c2d2-3140-83a7-32315d09feca
[12:00:21] [Server thread/INFO]: MyAwsomeUsername joined the game
[12:00:21] [Server thread/INFO]: MyAwsomeUsername[/111.111.111.111:45470] logged in with entity id 11767 at ([world]61.45686149445207, 70.9375, -175.44700729217607)
[12:00:27] [Server thread/INFO]: MyAwsomeUsername issued server command: /wgergerger
[12:00:29] [Async Chat Thread - #2/INFO]: <MyAwsomeUsername> gerg
[12:00:33] [Async Chat Thread - #2/INFO]: <MyAwsomeUsername> gerger
[12:00:35] [Async Chat Thread - #2/INFO]: <MyAwsomeUsername> rerg
[12:00:37] [Server thread/INFO]: MyAwsomeUsername lost connection: Disconnected
[12:00:37] [Server thread/INFO]: MyAwsomeUsername left the game
[12:00:38] [User Authenticator #8/INFO]: UUID of player MyAwsomeUsername is d800b63e-c2d2-3140-83a7-32315d09feca
[12:00:38] [Server thread/INFO]: MyAwsomeUsername joined the game
[12:00:38] [Server thread/INFO]: MyAwsomeUsername[/111.111.111.111:45476] logged in with entity id 11793 at ([world]62.97573252632079, 71.0, -179.01739415148737)
[12:00:40] [Server thread/INFO]: MyAwsomeUsername lost connection: Disconnected
[12:00:40] [Server thread/INFO]: MyAwsomeUsername left the game
[12:00:51] [User Authenticator #8/INFO]: UUID of player MyAwsomeUsername is d800b63e-c2d2-3140-83a7-32315d09feca
[12:00:51] [Server thread/INFO]: MyAwsomeUsername joined the game
[12:00:51] [Server thread/INFO]: MyAwsomeUsername[/111.111.111.111:45486] logged in with entity id 11805 at ([world]62.97573252632079, 71.0, -179.01739415148737)
[12:00:55] [Server thread/INFO]: MyAwsomeUsername lost connection: Disconnected
[12:00:55] [Server thread/INFO]: MyAwsomeUsername left the game


Пояснение:

Я прокомментировал другой Grok, чтобы объяснить проблему проще (точно такая же проблема, когда их не запомнили)

Я проверил 3 ситуации:

  1. Комментарии 2 и 3, а также другие, и только 1 был активен, в этом случае каждая строка журнала анализировалась без какого-либо _grokparsefailure в записи.
  2. Только был прокомментирован так же, как и другие, и 1 и 2 были активными. в этом случае строка журнала с совпадением с номером 2 была проанализирована без _grokparsefailure, а другие получили _grokparsefailure. это все еще имеет смысл!
  3. В последней ситуации я раскомментировал все 3 Grok (1, 2, 3 были активными), и каждая строка журнала была проанализирована НО с _grokparsefailure в ней! хотя break_on_match по умолчанию true, и когда он соответствует Grok 2, его не следует тестировать с Grok 3.

Я прочитал другой вопрос, похожий на меня, в stackoverflow: Аналогичный вопрос 1 и я добавил блок mutate перед фильтрами grok (потому что каждая строка журнала заканчивается на \ n), но ничего не изменилось, и проблема не исчезла!

еще одна вещь, о которой я думаю, мне нужно упомянуть, это тот факт, что я знаю, что добавляю больше Grok рядом с Grok 2 (3 и другими), потому что этот тег вызывает то, что некоторые из журналов вообще не соответствуют Grok 2 и должны обернуть их регулярным выражением. но на данный момент журналы, соответствующие Grok 2, должны быть в порядке (не _grokparsefailure), но это не так! (Прочтите это в вопросе о переполнении стека: аналогичный вопрос 2


person Mohammad Amin    schedule 02.09.2020    source источник


Ответы (1)


Фактически, это ожидаемое поведение, вы немного сбиваете с толку, как работают logstash и grok.

Во-первых, все фильтры независимы друг от друга, использование break_on_match в grok влияет только на этот grok, не имеет значения для других grok фильтров, которые появляются после этого в вашем конвейере. break_on_match также имеет смысл только тогда, когда у вас есть более одного шаблона в одном grok, что не в вашем случае.

Во-вторых, поскольку Logstash является последовательным и вы не используете никаких условий, ваши grok фильтры будут применяться к каждому сообщению в вашем конвейере, не имеет значения, было ли оно уже проанализировано, это то, что заставляет ваши строки получать _grokparsefailure

Чтобы исправить это, вам нужно использовать условные выражения.

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

if "_grokparsefailure" in [tags] {
  grok {
    match => "your pattern"
    add_tag => "your tags"
    remove_tag => ["_grokparsefailure"]
  }
}

Этот grok будет применяться только в том случае, если сообщение имеет _grokparsefailure в поле tags, если сообщение соответствует вашему шаблону, этот тег будет удален, если он не совпадает, тег останется, и сообщение может быть протестировано следующими гроками.

В итоге ваша grok конфигурация должна выглядеть примерно так.

grok {
  "your first grok"
}

grok {
  "your second grok, can be any of the others"
}

if "_grokparsefailure" in [tags] {
  grok {
    "your grok N"
    remove_tag => ["_grokparsefailure"]
  }
}

Это необходимо только потому, что вы добавляете разные теги для каждого сообщения. Если вы переместите эту логику в фильтр mutate, например, вы можете использовать только два grok фильтра, второй будет мульти-шаблон grok, с break_on_match, установленным на true .

grok {
  match => { 
    "message" => [ 
      "pattern from grok 2",
      "pattern from grok 3",
      "pattern from grok N"
    ]
  }
  break_on_match => true
}
person leandrojmp    schedule 02.09.2020