Logstashは、データを収集し、データを解析して処理し、最後にデータをストレージコンポーネントに出力するために使用される処理エンジンです。データ処理フローは次のとおりです。
Logstash Java Filterはを基于Logstash的Filter扩展API
開発するためのもの用Java语言实现的Filter
であり、その後開発されFilter代码打包构建到自己服务器上的Logstash Filter lib
ます。数据流转配置文件中(也就是logstash -f 指定的配置文件)
このカスタマイズされたLogstash Javaフィルターを使用できます。
カスタマイズ手順には、次の5つの手順が含まれます。
1. Logstash環境を準備する
Logstash Java FilterはLogstash APIに依存しているため、Logstashソースコードをダウンロードしてビルドする必要があります
1.1。logstashソースコードをダウンロードする
git clone --branch <branch_name> --single-branch https://github.com/elastic/logstash.git <target_folder>
复制代码
どちらの<branch_name>
必要性は、あなたがなります7.1後GAバージョンを使用して、使用したいlogstashバージョンを交換します。<target_folder>は、ダウンロードするlogstashコードの親ディレクトリで置き換える必要があります。指定しない場合、現在のディレクトリのlogstashフォルダーにダウンロードされます。ここではバージョン7.6を使用しています。
git clone --branch 7.6 --single-branch https://github.com/elastic/logstash.git
复制代码
1.2。logstashソースコードをビルドする
現在のディレクトリのlogstashディレクトリ(つまり、logstashのソースディレクトリ。以降、以下で参照する)に移動して$LS_HOME
実行します。
./gradlew assemble
复制代码
Windowsシステムの場合は、gradlew.bat assemble
この手順は長い間待つ必要があります。ダウンロードできない場合は、gradleの国内ミラーを追加してみてください。vim $LS_HOME/build.gradle
そして、ファイルに追加します
repositories {
maven { url 'https://maven.aliyun.com/repository/google/' }
maven { url 'https://maven.aliyun.com/repository/jcenter/'}
mavenCentral()
maven {
url 'https://plugins.gradle.org/m2/'
}
}
复制代码
構築に成功し$LS_HOME/logstash-core/build/libs/
たら、それがディレクトリに生成されているかどうかを確認しlogstash-core-x.y.z.jar
ます。ここで、x、y、zはダウンロードしたlogstashのバージョン番号です。鉱山は
/Users/xx/corprepo/logstash/logstash-core/build/libs/logstash-core-7.6.3.jar
复制代码
2. Logstash Java Filterコードを記述します
2.1。公式デモをダウンロードする
オフィシャルはデモを提供しており、このデモに基づいてダウンロードおよび変更できます。
2.2。LOGSTASH_CORE_PATHを指定する
デモをダウンロードしたら、プロジェクトのルートディレクトリにgradle.properties
ファイルを作成し、データ行を追加します。
LOGSTASH_CORE_PATH=<target_folder>/logstash-core
复制代码
2.3。フィルターコードの開発
独自のJava Filter関数を実装するには、LogstashのFilter APIを継承する必要があります。適切なフィルターは次のとおりです。
import co.elastic.logstash.api.Configuration;
import co.elastic.logstash.api.Context;
import co.elastic.logstash.api.Event;
import co.elastic.logstash.api.Filter;
import co.elastic.logstash.api.FilterMatchListener;
import co.elastic.logstash.api.LogstashPlugin;
import co.elastic.logstash.api.PluginConfigSpec;
import org.apache.commons.lang3.StringUtils;
import java.util.Collection;
import java.util.Collections;
//类名必须按照驼峰命名匹配这个下划线注解名,JavaFilterExample -> java_filter_example
@LogstashPlugin(name = "java_filter_example")
public class JavaFilterExample implements Filter {
//定义一个该Filter支持的setting配置。名字是source,默认值为message
//可从filter方法中看出是拿 SOURCE_CONFIG 的value值做field 的名称使用的
public static final PluginConfigSpec<String> SOURCE_CONFIG =
PluginConfigSpec.stringSetting("source", "message");
private String id;
private String sourceField;
public JavaFilterExample(String id, Configuration config, Context context) {
// constructors should validate configuration options
this.id = id;
this.sourceField = config.get(SOURCE_CONFIG);
}
/**
* 该Filter的过滤逻辑,可以对输入的event数据做各种CRUD操作
* @param events
* @param matchListener
* @return 最终流转到下一个pipeline的数据,如果有符合条件的event必须返回
*/
@Override
public Collection<Event> filter(Collection<Event> events, FilterMatchListener matchListener) {
for (Event e : events) {
Object f = e.getField(sourceField);
if (f instanceof String) {
e.setField(sourceField, StringUtils.reverse((String)f));
matchListener.filterMatched(e);
}
}
return events;
}
/**
*
* @return 返回该Filter支持的所有setting配置
*/
@Override
public Collection<PluginConfigSpec<?>> configSchema() {
// should return a list of all configuration options for this plugin
return Collections.singletonList(SOURCE_CONFIG);
}
/**
*
* @return 该Filter的ID,Logstash会帮我们赋值
*/
@Override
public String getId() {
return this.id;
}
}
复制代码
注意すべき点が2つあります。
-
@LogstashPlugin
注釈name
はクラス名と非常に一貫している必要があります。java_filter_example-> JavaFilterExampleなど(私はとにかくハッキングされています...) -
実装
co.elastic.logstash.api.Filter
クラスは必須です。インポートが失敗した場合、gradle.properties
構成が失敗したか、logstashソースコードが失敗したことを意味します。3つのメソッドを書き直します。
getId方法
フィルターのIDを返すと、Logstashが値を割り当てます。私たちは、1つを定義する必要があり成员变量
、构造方法中赋值进去
ちょうど罰金を。
configSchema方法
このフィルターでサポートされるすべての設定構成セットを返します。PluginConfigSpec
定義されたsetting配置
私たちはlogstash設定ファイルにフィルタを使用する時間、あなたは、このようなGROKフィルターにパスを使用した場合などのパラメータを渡すことができますpatterns_dir
とmatch
。
filter {
grok {
patterns_dir => ["./patterns"]
match => { "message" => "%{SYSLOGBASE} %{POSTFIX_QUEUEID:queue_id}: %{GREEDYDATA:syslog_message}" }
}
}
复制代码
このPluginConfigSpec
設定でサポートされる構成パラメーターはname, type, deprecation status, required status, 和 default value
次のとおりです。
私たちのクラスでフィルター、我々が定義しますPluginConfigSpec<String> SOURCE_CONFIG = PluginConfigSpec.stringSetting("source", "message");
name=source, default value= message
filter方法
フィルターはもちろんフィルタリングを行う必要があります。Collection<Event> events
入力パラメーターは、処理したい入力データであり、ロジックに対していくつかのCURD操作を実行できます。FilterMatchListener matchListener
入力パラメーターは、フィルターが自身のロジックを満たすイベントデータをmatchListenerに通知することです。たとえば、LogstashでのmatchListenerの実装はDecoratingFilterMatchListener
です。たとえば、実行できる操作では、ADD_FIELD
最初にPluginConfigSpecを定義し、次にFilterを使用するときにadd_field
パラメーターを構成する必要があります。たとえば、grok FilterはこのパラメーターとDecoratingFilterMatchListenerをサポートしています
filter {
grok {
add_field => { "foo_%{somefield}" => "Hello world, from %{host}" }
}
}
复制代码
matchListenerに通知する必要がない場合は呼び出す必要はありませんmatchListener.filterMatched(e)
。
3.ユニットテスト
デモにはテストクラスもあり、実行後に終了します。。
4.フィルターのパッケージ化と展開
Filterプロジェクトをruby gemパッケージにするには、gradleを使用する必要があるため、デモプロジェクトのgradle構成ファイルに基づいて変更するのが最善です。
4.1。Gradleパッケージタスクの構成プロジェクトのルートパスの下のbuild.gradle
ファイルを編集します
plugin info
その一部は、フィルターの情報です。変更が必要な特別なポイントをTODO
マークしました。4.2。Gradleパッケージタスクを実行し、プロジェクトのルートディレクトリで実行します
./gradlew gem
复制代码
Windowsシステムの実行gradlew.bat gem
正常に実行すると、プロジェクトのルートディレクトリに生成されたlogstash-{plugintype}-<pluginName>-<version>.gem
ファイルが表示されます
4.3。フィルターgemパッケージをLogstashにインストールし、logstashディレクトリ($ LS_HOME)で実行します
bin/logstash-plugin install --no-verify --local /path/to/javaPlugin.gem
复制代码
これは/path/to/javaPlugin.gem
私たちがステップ4.2で生成された絶対宝石のパスです。
5. Javaフィルターを使用してLogstashを実行します
5.1。$ LS_HOME / configディレクトリにlogstash実行構成ファイルを作成しますjava_filter.conf
input {
generator { message => "Hello world!" count => 1 }
}
filter {
# java_filter_example:我们的filter中@LogstashPlugin注解的name
java_filter_example {}
}
output {
stdout { codec => rubydebug }
}
复制代码
5.2。Logstash開始 $ LS_HOMEで実行されています
bin/logstash -f config/java_filter.conf
复制代码
それでおしまい〜
{
"message" => "!dlrow olleH",
"sequence" => 0,
"@version" => "1",
"host" => "xxdeMacBook-Pro.local",
"@timestamp" => 2020-04-12T13:15:30.376Z
}
复制代码
読んでくれてありがとう、私の名前はMonica23334 || Monica2333です。毎週オリジナル記事フラッグを書いてフォローしてくれてフェイススラップが楽しみな女性〜
公式ドキュメントを参照してください:www.elastic.co/guide/en/lo…