Logstashは、 1つまたは複数の入力からのイベントを抽出し、パイプラインを処理するオープンソースのデータであり、それらを変換し、その後、1つ以上の出力に各イベントを送信します。Logstashいくつかの実装では、コードの複数のラインを有していてもよく、複数の入力ソースからのイベントを処理することができます。これらより保守を実現するために、私は、モジュラーコンポーネントの再利用性からパイプラインを作成することで、コードを改善する方法を紹介します。
この記事を書くための動機
汎用ロジックのサブセットを処理することがしばしば必要Logstashは、複数の入力ソースからのイベントに適用されます。通常、2つの方法のいずれかによって達成:
- それは簡単にすべてのソースからのすべての汎用論理イベントに適用することができるように、単一管の異なるソースからの複数のイベントを処理します。そのような実装では、汎用ロジック、条件付きロジックの通常大量に加えました。したがって、この方法は複雑で理解しにくい実装Logstashになることがあります。
- 各ユニークな入力ソースからのイベントを処理するためのユニークなパイプの実装。この方法は、それが困難なコードの共通部分を維持することを可能にする各パイプの一般的機能、にコピーしてコピーする必要があります。
ブログモジュラーダクト成分によって説明した本技術は、異なるファイルに格納され、その後、管は、これにより、上記の方法の欠点を解決し、これらの成分の組み合わせによって構成されています。この技術は複雑さを軽減することができ、パイプラインは、コードの重複を排除することができます。
モジュラーパイプライン建設
Logstash プロファイル入力、及び出力フィルタLogstashコンポーネント配管によって行われます。
より高度な設定では、典型的にLogstash例が存在する複数のパイプを行います。デフォルトでは、ときのパラメータなしのスタートLogstashは、それが名前のファイル読み込みpipelines.yml文書を、および指定されたパイプをインスタンス化します。
Logstash入力、および出力フィルタを指定することで、複数のファイルに保存することができるグロブ表現をパイプラインに含まれるファイルを選択します。グローバル式ファイルは一致してアルファベット順に組み合わせを。フィルタの実行順序は、通常、非常に重要であるので、これファイル名は、所望の順序の組み合わせでファイルが役立つかもしれないことを保証する数値識別子を含みます。
以下では、これらのパイプは、いくつかのモジュールコンポーネントLogstashの組み合わせである、ユニークな2本のパイプを定義します。私たちは、コンポーネントは、次のファイルに格納されていLogstashます。
- 文を入力します。01_in.cfg、02_in.cfg
- フィルターの声明:01_filter.cfg、02_filter.cfg、03_filter.cfg
- 出力文:01_out.cfg
そして、使用グロブ表現をしてpipelines.yml次のように、カスタムパイプラインと必要なコンポーネントで許可されています:
- pipeline.id: my-pipeline_1
path.config: "<path>/{01_in,01_filter,02_filter,01_out}.cfg"
- pipeline.id: my-pipeline_2
path.config: "<path>/{02_in,02_filter,03_filter,01_out}.cfg"
パイプライン構成では、2本のパイプは、本文書である02_filter.cfg、ドキュメントを定義し、維持するコードの2本のパイプの総数を、そしてどのように両方のファイルに複数の導管によってコードを実行する方法を示します。
テストパイプライン
このセクションでは、我々はファイルの具体的な例を提供し、これらのファイルは言わにマージされpipelines.yml定義された単一のダクト。私たちは、その後、Logstashを実行するために、これらのファイルを使用して、生成された出力を示しています。
プロファイル
入力ファイル:01_in.cfg
文書は、定義発電機入力。テストLogstashに設計されたBuilderの入力は、この場合には、イベントを生成します。
input {
generator {
lines => ["Generated line"]
count => 1
}
}
入力ファイル:02_in.cfg
このファイルには、リスナーのLogstash入力STDINを定義します。
input {
stdin {}
}
フィルタファイル:01_filter.cfg
filter {
mutate {
add_field => { "filter_name" => "Filter 01" }
}
}
フィルタファイル:02_filter.cfg
filter {
mutate {
add_field => { "filter_name" => "Filter 02" }
}
}
フィルタファイル:03_filter.cfg
filter {
mutate {
add_field => { "filter_name" => "Filter 03" }
}
}
出力ファイル:01_out.cfg
output {
stdout { codec => "rubydebug" }
}
実行パイプライン
オプションを指定せずにLogstash私たちの前に定義されたの実装を開始しますpipelines.ymlのファイルを。ファイル名を指定して実行Logstashは、次の通り:
./bin/logstash
パイプラインがあるので、私の-pipeline_1シミュレート入力イベントに発電を実行されているので、初期化後にLogstashが完了すると、我々は次の出力が表示されるはずです。このことは01_filter.cfgと02_filter.cfg期待通りにコンテンツがパイプラインによって実行されました。
{
"@timestamp" => 2020-02-29T02:44:40.024Z,
"host" => "liuxg-2.local",
"sequence" => 0,
"message" => "Generated line",
"@version" => "1",
"filter_name" => [
[0] "Filter 01",
[1] "Filter 02"
]
}
別の名前の場合は私の-pipeline_2をパイプラインが標準入力の入力を待っているとき、我々はすべてのイベントパイプライン処理を確認するためには至っていません。端末操作Logstashに入力し、この目的のためにイベントのパイプラインを作成するには、Returnキーを押します。これが完了すると、あなたは、次のようなものが表示されます。
hello, the world!
{
"message" => "hello, the world!",
"@version" => "1",
"@timestamp" => 2020-02-29T02:48:26.142Z,
"host" => "liuxg-2.local",
"filter_name" => [
[0] "Filter 02",
[1] "Filter 03"
]
}
我々は、用途に応じて、上から見ることができます02_filter.cfgと03_filter.cfgロジック。
実行順序
、Logstashは、ファイルの順序のグロブ表現に注意を払っていないのでご注意ください。それだけであなたがアルファベット順に並べ替え、次にそれら含める、としたいファイルを決定するためにglob表現を使用しています。我々は変更したい場合でも、この手段私-pipeline_2はそう、定義された03_filter.cfgに表示され02_filter.cfg各イベントの前にグロブ表現もします03_filter.cfgによって定義されたフィルタの前に02_filter.cfgフィルタ。
結論
モジュラーコンポーネントとコンジットをLogstashできるグローバルな表現を使用して、これらの成分は、別々のファイルとして保存されます。これは、コードの保守性、再利用性と可読性を向上させます。
ところで、このブログの技術的な記録に加えて、我々はまた、考慮すべきである通信パイプにパイプラインを、それがLogstash実装モジュールを向上させることができるかどうかを確認します。
参考:
【1】https://www.elastic.co/blog/how-to-create-maintainable-and-reusable-logstash-pipelines