본문 바로가기

IT/Logstash

Logstash Filter 플러그인을 만들어보자. #2

분리된 프레임워크에서 적재해주는 문서를 Elasticsearch에 색인하기 위해 요 한 주간 Logstash를 만져봤다.


원하는 기능을 수행하기 위해 Logstash에서 제공하는 플러그인들의 목록을 이리 뒤지고 저리 뒤져보았지만,

다른 사람들이 짜놓은 플러그인들이 완성도는 높을지 모르나 내 의도대로 처리하기엔 직접 짜는 것만 못하더라.

기억 및 공유를 위해 플러그인을 짜고 적용해 본 과정을 기록해둔다.


본 포스트에서는 Logstash 플러그인의 제한적인 배포만을 다룬다.

Github 및 Rubygems.org에 등록 없이 로컬에서만 빌드 및 설치를 수행했다.


Logstash 공식 도큐먼트의 플러그인 가이드를 적극 참고했다.

아직 어지럽고 허술하지만 대략적인 가이드라인으로는 모자람이 없다.

https://www.elastic.co/guide/en/logstash/current/_how_to_write_a_logstash_filter_plugin.html




#2 : filter 플러그인을 만들기 위한 준비작업


커다란 글씨 바로 위의 링크를 눌러 filter 플러그인 제작에 대한 공식 도큐먼트를 살펴보자.

기본적으로 Logstash의 플러그인은 Ruby로 코딩한 후 gem파일로 빌드하여 이를 install 해야한다. 

플러그인의 depth에 따라 다르겠지만 개인적으로는 기본적인 문법 정도만 숙지하는 것으로 충분했다.


개발하고자 하는 플러그인의 depth에 따라 경우가 달라질 수 있겠지만,

개인적으론 루비 20분 가이드 및 구글링으로 나오는 문서들로 충분했으며 대부분의 플러그인 또한 마찬가지일 것이다.


상단에 링크된 Filter (및 다른) 플러그인 가이드에서 소개하는 프로젝트 부트스트래핑 과정은 다음과 같다.

1. Git에 본인의 Repository를 만들고, 빈 껍데기 상태의 프로젝트를 Clone 한다.

2. Logstash에서 제공하는 Plugin Example 프로젝트를 임시 디렉토리에 Clone한다.

3. Clone 받은 Example 프로젝트 폴더에서 .git 폴더를 삭제한다.

4. 나머지 내용들을 Clone 해둔 본인 프로젝트에 복사한다.

5. 복사된 파일 중 본인의 플러그인에 맞게 파일명 및 내용을 수정한다.


하지만 본인은 로컬로만 빌드 및 설치하면 충분했으므로 Logstash Example 프로젝트만 내려받아 파일들을 수정해서 썼다.

그래도 필요한데 링크 누르긴 귀찮은 사람이 혹시라도 있을지 모르니 가이드에서 상세하게 제공한 Git 명령어를 옮겨둔다.

# 본인의 Git Repository에서 프로젝트를 Cloning 한다.
git clone https://github.com/GITUSERNAME/logstash-filter-MYPLUGINNAME.git

# 임시폴더를 만들고, Logstash Example 프로젝트를 Cloning 한다.
cd /tmp
git clone https://github.com/logstash-plugins/logstash-filter-example.git

# Cloning 한 폴더의 .git 폴더를 삭제한다.
cd logstash-filter-example
rm -rf .git

# .get 폴더를 제외한 Example 프로젝트의 내용을 본인 프로젝트의 폴더로 복사한다.
cp -R * /path/to/logstash-filter-mypluginname/


마지막으로 다음 3개의 파일명과 내용을 본인의 플러그인에 맞게 수정해주면 준비는 끝난다.

/logstash-filter-example.gemspec

/lib/logstash/filters/example.rb

/spec/filters/example_spec.rb


본인이 제작할 Filter 플러그인의 이름은 scdparser 였으므로, 위 파일명들을 다음과 같이 수정했다.

/logstash-filter-scdparser.gemspec

/lib/logstash/filters/scdparser.rb

/spec/filters/scdparser_spec.rb


최종적으로 다음과 같은 폴더구조가 되면 OK겠다.



참고 삼아 추측성으로 각 파일에 대한 역할 및 수정해야할 부분을 간략하게 적어보자면:


logstash-filter-PLUGINNAME.gemspec

Ruby 코딩이 끝난 후 .gem으로 빌드할 때 참조되는 정보들을 기록하는 파일이다.

플러그인 이름, 버전, 라이센스, 플러그인에 대한 요약 정보, 제작자 등의 플러그인에 대한 정보에서부터

플러그인 또는 라이브러리의 디펜던시 정보(라이브러리명, 버전 허용 범위) 등도 함께 명시한다.

파일 내용은 s.require_paths 윗부분의 정보들은 항목대로 수정해주고,

아래 Ruby나 Java 등 라이브러리에 대한 디펜던시는 플러그인에서 필요한대로 추가해준다.


PLUGINNAME.rb

실제 구현된 플러그인의 코드가 담기는 부분이다.

Logstash의 플러그인도 타 프레임워크의 많은 플러그인처럼 Base 클래스를 상속받아 구현하도록 되어있기 때문에

어떤 플러그인의 Example 프로젝트를 Cloning 했는지에 따라 코드 내용이 약간 다르다. (input or filter or output or codec)

본 파일에 대한 구현은 다음 포스팅에서 자세하게 다루도록 한다.


PLUGINNAME_spec.rb

플러그인을 간단하게 제작해보면서 이 파일은 무슨 역할을 담당하는지 잘 모르겠다.

Example 코드로 describe 예약어가 들어가있는 것으로 보아 의사코드 같기도 하고,

단순히 의사코드를 넘어 .rb 파일이 빌드 될 때 기대되는 플로우를 코딩해둔 것 같기도 하고. (JUnit의 assert 처럼)

본인의 경우에는 기본적으로 정의된 코드들을 바꾸지 않아도 별 문제 없이 빌드 및 설치가 가능했다.



"그대로 따라하기만 해야하는" 단계가 드디어 끝났다.

다음 포스트에선 실제 플러그인이 구동하는 핵심인 .rb 파일을 코딩해보도록 하자.