query - filebeat paths regex



Come elaborare la voce di registro multilinea con il filtro logstash? (3)

Ho esaminato il codice sorgente e ho scoperto che:

  • Il filtro multilinea annullerà tutti gli eventi considerati come un seguito di un evento in sospeso , quindi aggiungerà quella riga al campo del messaggio originale, ovvero tutti i filtri che seguono il filtro multilinea non verranno applicati in questo caso
  • L'unico evento che passerà mai il filtro è uno che è considerato come nuovo (qualcosa che inizia con [ nel mio caso]

Ecco il codice funzionante:

input {
   stdin{}
}  

filter{
      if "|ERROR|" in [message]{ #if this is the 1st message in many lines message
      grok{
        match => ['message',"\[.+\] - %{IP:ip}\|%{LOGLEVEL:loglevel}\| %{PATH:file}\|%{NUMBER:line}\|%{WORD:tag}\|%{GREEDYDATA:content}"]
      }

      mutate {
        replace => [ "message", "%{content}" ] #replace the message field with the content field ( so it auto append later in it )
        remove_field => ["content"] # we no longer need this field
      }
    }

    multiline{ #Nothing will pass this filter unless it is a new event ( new [2014-03-02 1.... )
        pattern => "^\["
        what => "previous"
        negate=> true
    }

    if "|DEBUG| flush_multi_line" in [message]{
      drop{} # We don't need the dummy line so drop it
    }
}

output {
  stdout{ debug=>true }
}

Saluti,

Abdou

https://src-bin.com

Sfondo:

Ho un file di registro generato dall'utente che ha il seguente schema:

[2014-03-02 17:34:20] - 127.0.0.1|ERROR| E:\xampp\htdocs\test.php|123|subject|The error message goes here ; array (
  'create' => 
  array (
    'key1' => 'value1',
    'key2' => 'value2',
    'key3' => 'value3'
  ),
)
[2014-03-02 17:34:20] - 127.0.0.1|DEBUG| flush_multi_line

La seconda voce [2014-03-02 17:34:20] - 127.0.0.1|DEBUG| flush_multi_line [2014-03-02 17:34:20] - 127.0.0.1|DEBUG| flush_multi_line È una linea fittizia, solo per far sapere a logstash che l'evento multi linea è finito, questa linea è caduta in seguito.

Il mio file di configurazione è il seguente:

input {
  stdin{}
}

filter{
  multiline{
      pattern => "^\["
      what => "previous"
      negate=> true
  }
  grok{
    match => ['message',"\[.+\] - %{IP:ip}\|%{LOGLEVEL:loglevel}"]
  }

  if [loglevel] == "DEBUG"{ # the event flush  line
    drop{}
  }else if [loglevel] == "ERROR"  { # the first line of multievent
    grok{
      match => ['message',".+\|.+\| %{PATH:file}\|%{NUMBER:line}\|%{WORD:tag}\|%{GREEDYDATA:content}"] 
    }
  }else{ # its a new line (from the multi line event)
    mutate{
      replace => ["content", "%{content} %{message}"] # Supposing each new line will override the message field
    }
  }  
}

output {
  stdout{ debug=>true }
}

L'output per il campo del contenuto è: The error message goes here ; array ( The error message goes here ; array (

Problema:

Il mio problema è che voglio memorizzare il resto del campo multilinea nel contenuto:

The error message goes here ; array (
  'create' => 
  array (
    'key1' => 'value1',
    'key2' => 'value2',
    'key3' => 'value3'
  ),
)

Quindi posso rimuovere il campo del messaggio più tardi.

Il campo @message contiene l'intero evento multilinea, quindi ho provato il filtro mutate , con la funzione di sostituzione , ma non riesco a farlo funzionare :(.

Non capisco il modo di lavorare del filtro Multiline, se qualcuno potesse far luce su questo, sarebbe molto apprezzato.

Grazie,

Abdou.


Answer #1

Il filtro multilinea aggiungerà "\ n" al messaggio. Per esempio:

"[2014-03-02 17:34:20] - 127.0.0.1|ERROR| E:\\xampp\\htdocs\\test.php|123|subject|The error message goes here ; array (\n  'create' => \n  array (\n    'key1' => 'value1',\n    'key2' => 'value2',\n    'key3' => 'value3'\n  ),\n)"

Tuttavia, il filtro grok non può analizzare "\ n". Quindi devi sostituire \ n con un altro personaggio, dice, spazio vuoto.

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

Quindi, il modello di grok può analizzare il messaggio. Per esempio:

 "content" => "The error message goes here ; array (   'create' =>    array (     'key1' => 'value1',     'key2' => 'value2',     'key3' => 'value3'   ), )"

Answer #2

la gestione di grok e multiline è menzionata in questo numero https://logstash.jira.com/browse/LOGSTASH-509

Aggiungi semplicemente "(? M)" di fronte alla tua regex di grok e non avrai bisogno di mutazione. Esempio dal problema:

pattern => "(?m)<%{POSINT:syslog_pri}>(?:%{SPACE})%{GREEDYDATA:message_remainder}"