ログを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.
}
}