Gibbs Kim's playground

[ElasticStack-19] Logstash multiline indexing 본문

Tech 기록지/Elastic Stack

[ElasticStack-19] Logstash multiline indexing

Lio Grande 2020. 6. 19. 11:39

웹크롤링등을 하여 다음과 같은 패턴의 텍스트 파일이 있다고 하자.

<HTML>
<HEAD> 텍스트 막 써대 </HEAD>
<BODY> 이렇게 막 써대 </BODY>
...
...
</HTML>

이때, HTML TAG를 제외한 내용을 엘라스틱서치에 인덱싱하고 싶다면 다음과 같이 .conf 파일을 작성해보자

### It is operated on ELK 7.7.1
input{
	file{
    	path => "WANTED_FILE_PATH" ## you should write your own file or dir path
        start_position => "beginning"
        sincedb_path => "/dev/null"
        ## above two lines, based on linux OS
        codec => multiline {
        	pattern => "^\\n"
            negate => true
            what => "previous"
            auto_flush_interval => 1
        }
    }
}

filter{
	grok{
    	match => { "path" => "%{GREEDYDATA}/%{GREEDYDATA:file_name}\.txt" }
    }
    mutate{
    	gsub => [ "message", "<.*?>", "" ]
        remove_field => ["path","host","@version","@timestamp","tags"]
    }
    if [message] == "" {
                drop { }
        }
}

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

확인한 바로 multiline codec의 특이사항은 다음의 항목들인것 같다.

1. 줄바꿈을 없애고 싶을 때 패턴 등록 줄바꿈은 "^\\n"으로 설정

2. auto_flush_interval 옵션을 적용해주지 않으면 업로드가 되지 않고 flush가 loop상태에 빠진다 (Debug 모드 확인시)

 

filter 항목에서는 gsub를 활용하여 <HTML> 형태의 태그를 없앨 수 있다. 이렇게 태그를 없애면 특정 필드(예: "message")에서 값이 "" 들어가 있는 녀석들이 발생하는데, if-drop 옵션을 사용해 없애버릴수 있다.