Создание собственного шаблона GROK - PullRequest
0 голосов
/ 11 марта 2020

в настоящее время я пытаюсь создать шаблон grok для этого журнала

2020-03-11 05:54:26,174 JMXINSTRUMENTS-Threading [{"timestamp":"1583906066","label":"Threading","ObjectName":"java.lang:type\u003dThreading","attributes":[{"name":"CurrentThreadUserTime","value":18600000000},{"name":"ThreadCount","value":152},{"name":"TotalStartedThreadCount","value":1138},{"name":"CurrentThreadCpuTime","value":20804323112},{"name":"PeakThreadCount","value":164},{"name":"DaemonThreadCount","value":136}]}]

В данный момент я могу правильно сопоставить потоки до JMXINTRUMENTS-Threading, используя этот шаблон:

%{TIMESTAMP_ISO8601:timestamp} (?<instrument>[^\ ]*) ?%{GREEDYDATA:log_message}

Но я не могу соответствовать всем значениям после этого. Кто-нибудь понял, какой шаблон мне следует использовать?

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Это сработало для меня после определения другого источника и цели в фильтре JSON. Спасибо за помощь!

filter {
    if "atlassian-jira-perf" in [tags] {
    grok {
     match => { "message" =>"%{TIMESTAMP_ISO8601:timestamp} (?<instrument>[^\ ]*) ?%{GREEDYDATA:log_message_raw}" }
     tag_on_failure => ["no_match"]
     add_tag => ["bananas"]
  }
  if "no_match" not in [tags] {
    json {
      source => "log_message_raw"
      target => "parsed"
    }
  }
  mutate {    
        remove_field => ["message"]
    }
}
}
0 голосов
/ 11 марта 2020

я пробую ваш шаблон в https://grokdebug.herokuapp.com/ (который является официальным отладчиком для logsta sh), и он сопоставляет все после "JMXINTRUMENTS-Threading" с вашим шаблоном в большом поле с именем сообщение в журнале, таким образом:

{
  "timestamp": [
    [
      "2020-03-11 05:54:26,174"
    ]
  ],
  "YEAR": [
    [
      "2020"
    ]
  ],
  "MONTHNUM": [
    [
      "03"
    ]
  ],
  "MONTHDAY": [
    [
      "11"
    ]
  ],
  "HOUR": [
    [
      "05",
      null
    ]
  ],
  "MINUTE": [
    [
      "54",
      null
    ]
  ],
  "SECOND": [
    [
      "26,174"
    ]
  ],
  "ISO8601_TIMEZONE": [
    [
      null
    ]
  ],
  "instrument": [
    [
      "JMXINSTRUMENTS-Threading"
    ]
  ],
  "log_message": [
    [
      "[{"timestamp":"1583906066","label":"Threading","ObjectName":"java.lang:type\\u003dThreading","attributes":[{"name":"CurrentThreadUserTime","value":18600000000},{"name":"ThreadCount","value":152},{"name":"TotalStartedThreadCount","value":1138},{"name":"CurrentThreadCpuTime","value":20804323112},{"name":"PeakThreadCount","value":164},{"name":"DaemonThreadCount","value":136}]}]"
    ]
  ]
}

если вы хотите, чтобы sh соответствовало всем полям, содержащимся в сообщении журнала, вы должны использовать фильтр json в секции logsta sh трубопровода, просто прямо под вашим фильтром Grok:

Например:

  grok {
     match => { "message" =>"%{TIMESTAMP_ISO8601:timestamp} (?<instrument>[^\ ]*) ?%{GREEDYDATA:log_message}" }
     tag_on_failure => ["no_match"]
  }
  if "no_match" not in [tags] {
    json {
      source => "log_message"
    }
  }

Таким образом, ваш json будет разделен на ключ: значение и проанализирован.

РЕДАКТИРОВАТЬ:

Вы можете попробовать использовать kv фильтр вместо json, здесь документы: https://www.elastic.co/guide/en/logstash/current/plugins-filters-kv.html

grok {
     match => { "message" =>"%{TIMESTAMP_ISO8601:timestamp} (?<instrument>[^\ ]*) ?%{GREEDYDATA:log_message}" }
     tag_on_failure => ["no_match"]
  }
  if "no_match" not in [tags] {
    kv {
      source => "log_message"
      value_split => ":" 
      include_brackets => true #remove brackets
      remove_char_key => "\""
      remove_char_value => "\""
      field_split => ","
    }
  }
...