Logstash Java filter plugin 개발

Logstash Java filter plugin 개발

Elastic 공식 Docs의 How to write a Java filter plugin 에 잘 나와있지만,
내용대로 진행시 몇가지 에러가 발생했다.

  • FAILURE: Build failed with an exception
  • error: package co.elastic.logstash.api does not exist

으로 검색하여 들어오신 분에게 도움이 되었으면 합니다!

intro

이때까지 Logstash 를 사용하면서 기본 input, filter, output 플러그인들만 사용했었는데
급하게 특정 필드의 암호화/복호화가 필요하여 구글링결과 Java filter plugin 라는 것을 찾았다.

해당 플러그인을 통해 아래와 같이 input 으로 들어온 특정 필드를 내가 만든 Java 코드를 통해 변환시킬 수 있다.

Java filter plugin 을 통해 개발한 custom 암복호화 filter
1
2
3
4
5
6
7
8
9
10
11
12
input {
...
}

filter {
my_decrypt_plugin {
source => "encrypted_field"
key => "password"
}
}

...

이 문서에서는 Docs의 예제 코드를 plugin으로 만들때 발생하는 에러 해결방법을 설명합니다.

Java filter plugin

전체적인 방식은 How to write a Java filter plugin 에 잘 나와있지만,
해당 내용대로 진행시 (특정 Logstash 버전에서는) 몇가지 에러가 발생한다..

Logstash 다운로드

다음 방법 중 환경에 맞게 Logstash 를 다운로드
Elastic - Download Logstash

Logstash 버전 확인
1
2
3
$ bin/logstash --version
Using bundled JDK: /usr/share/logstash/jdk
logstash 7.11.2

Logstash-core 가 있어야 filter-plugin 빌드 가능

Logstash-core compile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 나에게 맞는 버전의 <branch_name> 으로 다운
# git clone --branch <branch_name> --single-branch https://github.com/elastic/logstash.git <target_folder>
cd ~/mywork
mkdir logstash_core
cd logstash_core
git clone --branch 7.11 --single-branch https://github.com/elastic/logstash.git .

# 빌드
./gradlew assemble

# core 빌드 확인
ll logstash-core/build/libs/
-rw-r--r-- 1 root root 1349807 Feb 26 02:52 logstash-core-7.11.2-javadoc.jar
-rw-r--r-- 1 root root 437112 Feb 26 02:52 logstash-core-7.11.2-sources.jar
-rw-r--r-- 1 root root 645893 Feb 26 02:52 logstash-core-7.11.2.jar

logstash-filter-java 예제코드 다운로드

logstash-filter-java
1
2
3
4
5
6
7
cd ~/mywork
git clone https://github.com/logstash-plugins/logstash-filter-java_filter_example

# elastic Docs에 있는대로 gradle.properties 만들어서 한줄추가
# LOGSTASH_CORE_PATH=/root/mywork/logstash_core/logstash-core/

# Docs 의 내용대로 다운받은 Java 코드를 원하는 필터의 형태로 수정해준다.

에러발생

이제 이 내용대로 예제코드들을 gem으로 만들려고 ./gradlew gem 하면 에러 발생

첫번째 에러

첫번째 에러
1
2
3
4
5
6
7
8
9
10
FAILURE: Build failed with an exception.
** Where:*
Build file '/root/mywork/logstash-filter-java_filter_example/build.gradle' line: 102
** What went wrong:*

A problem occurred configuring root project 'logstash-filter-java_filter_example'.
> Could not create task ':gem'.
> No signature of method: org.gradle.api.internal.tasks.DefaultTaskDependency$TaskDependencySet.getAt() is applicable for argument types: (ArrayList) values: [[task ':downloadAndInstallJRuby', task ':removeObsoleteJars', ...]]

# ... blah-blah

구글링결과 위와 같은 에러는 많은 글이 있었다.
출처: https://discuss.elastic.co/t/logstash-java-filter-plugin-example-gradlew-gem-error/257110
의 내용대로 build.gradle 을 수정

build.gradle
1
2
3
4
dependsOn [downloadAndInstallJRuby, removeObsoleteJars, vendor, generateRubySupportFiles]

dependsOn ([downloadAndInstallJRuby, removeObsoleteJars, vendor, generateRubySupportFiles])
으로 수정시 에러 해결

두번째 에러

두번째 에러
1
2
3
error: package co.elastic.logstash.api does not exist
import co.elastic.logstash.api.Configuration;
^

패키지를 못찾는 에러 발생
여기저기 구글링 중 결국 중국 블로그에서 해결책을 찾았다.
출처: https://www.cnblogs.com/shiqi17/p/14168550.html

build.gradle
1
2
3
4
implementation fileTree(dir: LOGSTASH_CORE_PATH, include: "**/logstash-core-?.?.?.jar")

implementation fileTree(dir: LOGSTASH_CORE_PATH, include: "**/logstash-core-?.??.?.jar")
으로 수정시 에러 해결

원인은 내가 받은 Logstash의 마이너 버전이 7.11.2 으로 두자리 숫자라 제대로 맵핑이 안되서 발생된 것이었다.
Logstash 의 버전을 확인하여 마이너 버전이 두자리일 경우에만 build.gradle 의 위 코드 ?.?.? 을 ?.??.? 으로 수정 하면 됩니다.

gem 으로 빌드된 custom plugin을 Logstash에 설치

Java filter plugin install
1
2
3
4
$ bin/logstash-plugin install --no-verify --local /root/mywork/logstash-filter-java_filter_example/logstash-filter-java_filter_example-1.0.2.gem
...
Installing logstash-filter-java_filter_example
Installation successful

설치한 플러그인 실행

example plugin test
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ cat java_filter.conf
input {
generator { message => "Hello world!" count => 1 }
}
filter {
java_filter_example {}
}
output {
stdout { codec => rubydebug }
}


$ bin/logstash -f ./java_filter.conf

{
"message" => "!dlrow olleH",
"@version" => "1",
"@timestamp" => 2021-02-26T04:05:27.633Z,
"host" => "host",
"sequence" => 0
}

댓글