2

aufzurufen. Ich benutze ELK mit logstash-logback-encoder um Logs in den Logstash zu schieben. Jetzt möchte ich den gleichen Stack verwenden, d. H. ELK mit logstash-logback-encoder für analytics.Logstash: Gibt es eine Möglichkeit, Grok-Templates auf Basis des Feldnamens

Fluss:

API(Create User)----> Commit data to RDBMS -----> 
Callback Listener(on post persist and post update) ---> 
Logger.info("IndexName: {} . DocId: {} .User json: {}", "Customer", user.getID(), user.getJson()); 

Logger.info(); logstash-logback-encoder, überträgt die Daten an Logstash, wodurch die Daten an ES gesendet werden.

Mein logstash.conf ist wie folgt:

input { 
tcp { 
port => 5044 
codec => multiline { 
what => "previous" 
    } 
} 
} 
filter{ 
grok { 
    match => ["message", "(?<index_name>(?<=IndexName:).*?(?=\s))"] 
    match => ["message", "(?<doc_id>(?<=DocId:).*?(?=\s))"] 
    break_on_match => false 
    remove_tag => ["_grokparsefailure","multiline"] 
} 
mutate { 
    gsub => ['message', "\t", " "] 
    gsub => ['message',"\e\[(\d*;)*(\d*)m"," "] 
} 
} 
output { 
if [index_name] == "Customer" { 
     elasticsearch { 
       hosts => ["localhost:9200"] 
       index => "analytics-customers" 
       document_id => "%{doc_id}" 
       } 
     }else { 
      elasticsearch { 
      hosts => ["localhost:9200"] 
     } 
     } 
    stdout { codec => rubydebug } 
    } 

Mein Problem ist, dass, wenn ich Logstash für Analysen verwendet werden soll, dann muss ich das json mit grok analysieren. Mit der Menge an Tabellen und Feldern, die ich habe, wird die logstash.conf wirklich riesig.

Gibt es eine Möglichkeit, wie ich Grow-Templates in der logstash.conf anwenden kann, die ich anhand des Indexnamens aufrufen kann. Like:

grok { 
match => ["message", "(?<index_name>(?<=IndexName:).*?(?=\s))"] 
if(index_name=="User"){ 
//Invoke User template which will fetch/create fields from passed json. 
} 
if(index_name=="Order"){ 
//Invoke Order template which will fetch/create fields from passed json. 
} 
} 

Antwort

0

Wenn Sie die Protokolle in einer einzigen Zeile zu bekommen verwalten, wäre es die schönste Art sein. Weil du den Codec in "json_lines" ändern kannst und alles automatisch geparst wird!

Ansonsten können Sie verwenden, wenn (beschrieben here)

Beispiel:

if [subsystem] == "http" { 
    mutate{ ... } 
    grok{ ... } 
} 
Verwandte Themen