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로 데이터를 푸시합니다. 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{ ... } 
}