2015-04-23 12 views
9

Ich habe ELK installiert und in meinem Rechner arbeiten, aber jetzt möchte ich eine komplexere Filterung und Feld hinzufügen abhängig von Ereignismeldungen.Hinzufügen von Feldern abhängig von Ereignismeldung in Logstash funktioniert nicht

Insbesondere möchte ich "id_error" und "descripcio" je nach dem Muster der Nachricht festlegen.

Ich habe versucht, viele Code-Kombinationen in "logstash.conf" Datei, aber ich bin nicht in der Lage, das erwartete Verhalten zu erhalten.

Kann mir jemand sagen, was ich falsch mache, was ich tun muss oder ob das nicht möglich ist? Danke im Voraus.

Dies ist meine "logstash.conf" Datei mit dem letzten Test, den ich gemacht habe, in keinen in Kibana erfassten Ereignisse resultieren:

input { 
    file { 
     path => "C:\xxx.log" 
    } 
} 

filter { 
    grok { 
     patterns_dir => "C:\elk\patterns" 
     match => [ "message", "%{ERROR2:error2}" ] 
     add_field => [ "id_error", "2" ] 
     add_field => [ "descripcio", "error2!!!" ] 
    } 
    grok { 
     patterns_dir => "C:\elk\patterns" 
     match => [ "message", "%{ERROR1:error1}" ] 
     add_field => [ "id_error", "1" ] 
     add_field => [ "descripcio", "error1!!!" ] 
    } 
    if ("_grokparsefailure" in [tags]) { drop {} } 
} 

output { 
    elasticsearch { 
    host => "localhost" 
    protocol => "http" 
    index => "xxx-%{+YYYY.MM.dd}" 
    } 
} 

Ich habe auch den folgenden Code versucht, in den Feldern „id_error resultierend "und" descripcio "mit beiden Variablen" [1,2] "und" [error1 !!!, error2 !!!] "in jedem übereinstimmenden Ereignis.

Da "break_on_match" standardmäßig auf "true" gesetzt ist, erwarte ich nur die Felder hinter der passenden Klausel, aber dies tritt nicht auf.

input { 
    file { 
    path => "C:\xxx.log" 
    } 
} 

filter { 
    grok { 
    patterns_dir => "C:\elk\patterns" 
    match => [ "message", "%{ERROR1:error1}" ] 
    add_field => [ "id_error", "1" ] 
    add_field => [ "descripcio", "error1!!!" ] 
    match => [ "message", "%{ERROR2:error2}" ] 
    add_field => [ "id_error", "2" ] 
    add_field => [ "descripcio", "error2!!!" ] 
    } 
    if ("_grokparsefailure" in [tags]) { drop {} } 
} 

output { 
    elasticsearch { 
    host => "localhost" 
    protocol => "http" 
    index => "xxx-%{+YYYY.MM.dd}" 
    } 
} 
+0

add_field (und add_tag) werden nur ausgeführt, wenn der Filter selbst erfolgreich ist, also, wenn Ihr grok {} nicht dem Muster entsprechen, die Feld wird nicht hinzugefügt. –

+0

Ich habe alle verschiedenen Fehlermuster einzeln überprüft und alle sind erfolgreich, das ist also nicht das Problem. – Natsen

+0

Ihre Ausgabe enthält also die Felder error1 und error2? –

Antwort

4

Ich habe das Problem gelöst. Ich erhalte die erwarteten Ergebnisse mit dem folgenden Code in „logstash.conf“:

input { 
    file { 
    path => "C:\xxx.log" 
    } 
} 

filter { 
    grok { 
    patterns_dir => "C:\elk\patterns" 
    match => [ "message", "%{ERROR1:error1}" ] 
    match => [ "message", "%{ERROR2:error2}" ] 
    } 
    if [message] =~ /error1_regex/ { 
    grok { 
     patterns_dir => "C:\elk\patterns" 
     match => [ "message", "%{ERROR1:error1}" ] 
    } 
    mutate { 
     add_field => [ "id_error", "1" ] 
     add_field => [ "descripcio", "Error1!" ] 
     remove_field => [ "message" ] 
     remove_field => [ "error1" ] 
    } 
    } 
    else if [message] =~ /error2_regex/ { 
    grok { 
     patterns_dir => "C:\elk\patterns" 
     match => [ "message", "%{ERROR2:error2}" ] 
    } 
    mutate { 
     add_field => [ "id_error", "2" ] 
     add_field => [ "descripcio", "Error2!" ] 
     remove_field => [ "message" ] 
     remove_field => [ "error2" ] 
    } 
    } 
    if ("_grokparsefailure" in [tags]) { drop {} } 
} 

output { 
    elasticsearch { 
    host => "localhost" 
    protocol => "http" 
    index => "xxx-%{+YYYY.MM.dd}" 
    } 
} 
Verwandte Themen