Можно ли анализировать динамическое содержимое журнала в формате xml с помощью Grok?

Возможно ли использовать Grok для анализа динамического содержимого журнала в формате xml, например:

<tag_1> contents </tag_1> ... <tag_N> contents </tag_N>

где "tag_*" будет именем поля, а "contents" - фактическим содержимым. Поэтому проанализированное сообщение будет выглядеть так:

{
  "tag_1": [
    [
      "contents"
    ]
  ],

....

  "tag_N": [
    [
      "contents"
    ]
  ]
}

person Gintautas Sulskus    schedule 04.07.2014    source источник


Ответы (1)


Не с grok. Вам нужно будет прибегнуть к рубиновому коду, чтобы разобрать XML и добавить его в структуру event.

Если ваш XML суперрегулярный (т.е. имеет корневой элемент и только один уровень под ним), вы могли бы использовать такой код:

filter {
    ruby {
        code => "
        msg = event['message'].split('><');
        for part in msg
            endpos = part.index('</')
            startpos = part.index('>')
            if !endpos.nil? && !startpos.nil? then
                tag = part[0,startpos];
                text = part[startpos+1,endpos-startpos-1];
                event[tag]=text
            end
        end
        "
    }
}

Если ваш xml более сложный, вам придется прибегнуть к реальному синтаксическому анализатору XML и выяснить, как использовать его с logstash (я никогда не добавлял внешнюю библиотеку в logstash).

person Alcanzar    schedule 08.07.2014