2

ログをLogstashにプッシュするためにlogstash-logback-encoderでELKを使用しています。今、分析用に同じスタック、つまりELKとlogstash-logback-encoderを使用したいと思います。Logstash:フィールド名に基づいてgrokテンプレートを呼び出す方法はありますか

フロー:

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はLogstashにデータをプッシュし、データをESにプッシュします。

マイlogstash.confは以下の通りです:

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 } 
    } 

私の問題は、私は分析のためにLogstashを使用したい場合は、その後、私はGROKを使用してJSONを解析する必要があるということです。私が持っているテーブルとフィールドの量によって、logstash.confは本当に巨大になります。

私は索引名に基づいて呼び出すことができるlogstash.confにgrokテンプレートを適用できますか。 ように:

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. 
} 
} 

答えて

0

あなたは、単一の行でログを取得するために管理することができれば、それは素敵な方法だろう。あなたが "json_lines"にコーデックを変更することができるので、すべてが自動的に解析されるからです!

は、そうしないと、(説明here)場合に使用することができます

例:

if [subsystem] == "http" { 
    mutate{ ... } 
    grok{ ... } 
} 
関連する問題