스플렁크는 key-value 구조를 갖는 데이터에 대한 동적 필드 생성을 자동으로 처리해준다. 이게 싫으면 props.conf의 KV_MODE 설정을 바꾸면 됨.
엘라스틱은 자동 처리를 지원하지는 않지만 기능은 제공한다. 다음은 인제스트 노드의 kv 프로세서를 이용한 key-value 처리.
POST _ingest/pipeline/_simulate{ "pipeline": { "processors": [ { "dissect": { "field": "message", "pattern": "%{url}?%{param}" } }, { "kv": { "field": "param", "field_split": " ", "value_split": "=" } } ] }, "docs": [ { "_source": { "message": "/path/a.php?a=1" } } ]}
{ "docs" : [ { "doc" : { "_index" : "_index", "_type" : "_doc", "_id" : "_id", "_source" : { "a" : "1", "param" : "a=1", "message" : "/path/a.php?a=1", "url" : "/path/a.php" }, "_ingest" : { "timestamp" : "2021-10-17T09:12:59.8240992Z" } } } ]}
로그스태시 역시 같은 기능의 kv 필터를 사용하면 된다. 그런데 beat는 해당 기능을 제공하지 않음. 물론 이 없으면 잇몸이라고 script 프로세서를 이용하면 같은 기능을 만들 수 있다.
processors: - dissect: tokenizer: "%{url}?%{param}" field: "message" target_prefix: "" - script: lang: javascript source: > function process(evt) { var key = evt.Get("param").split("=")[0]; var val = evt.Get("param").split("=")[1]; evt.Put(key, val); }
{ "@timestamp": "2021-10-17T09:13:36.296Z", "@metadata": { "beat": "filebeat", "type": "_doc", "version": "7.15.0" }, "param": "a=1", "a": "1", "message": "/path/a.php?a=1", "url": "/path/a.php"}
잠깐 살펴봤지만 인제스트 노드, 로그스태시, beat별로 데이터 수집 처리 체계가 조금씩 달라진다. 엘라스틱의 가장 큰 진입장벽이 아닐까 싶은데 오픈소스 연합(?) 성격 때문에 개선은 힘들 듯.
하지만 가장 먼저 제공된 로그스태시 기준의 기능 통일은 빨리 됐으면 좋겠다. 특히 beat 프로세서 중 dissect는 있는데 grok이 없는 건 이해가 가지 않는다. 일부러 안 만드나?
댓글 없음:
댓글 쓰기