Gibbs Kim's playground

[ElasticStack-15] Logstash Grok filtering 본문

Tech 기록지/Elastic Stack

[ElasticStack-15] Logstash Grok filtering

Lio Grande 2020. 6. 11. 10:47

.json 파일을 엘라스틱서치에 인덱싱하면 보통 "message" 필드에 중괄호( { } ) 내부에 있던 내용들이 저장된다.

이때 "key:value" 쌍이나 기타 값들을 적절하게 분류하여 필드와 데이터로 분류하고 싶다면 filter를 사용하게 되는데 Logstash에서는 보통 Grok filter를 통해 분류 작업을 수행한다.

 

[참고 링크]

https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns

 

elastic/logstash

Logstash - transport and process your logs, events, or other data - elastic/logstash

github.com

https://grokdebug.herokuapp.com/

 

Grok Debugger

One per line, the syntax for a grok pattern is %{SYNTAX:SEMANTIC}

grokdebug.herokuapp.com

 

예를 들어서 다음과 같은 형태의 JSON 파일이 있다고 하자.

{
	" key1": value1,
    " key2": value2,
    ...
    ...
}

Logstash로 인덱싱을 하면 다음과 같은 형태로 데이터가 저장된다.

"message": " key1": value1
"message": " key2": value2
...
...

이때 key의 필드를 'key_field', value의 필드를 'value_field'로 하고 싶다면 Grok 필터를 사용한다.

## logstash_idx.conf
input{
	file{
    	path => "FILE_PATH"
        start_position => "beginning"
        sincedb_path => "/dev/null"
    }
}
filter{
	grok{
    	match => {"message"=> " \"%{DATA:key_field}\": %{NUMBER:value_field}"}
    }
    mutate{
    	convert => {
        	"value_field" => "float"
        }
    }
}

output{
	elasticsearch{
    	hosts => "localhost:9200"
        index => "grok_test_idx"
    }
    stdout{
    	codec => rubydebug
    }
}

Grok 필터로 만든 필터의 타입은 초기에 무조건 'String'으로 설정된다. 따라서 Logstash에서 따로 타입을 설정하고 싶은 필드가 있다면 'mutate'를 적용해주자.