LogstashでMultiplePipelineに失敗した話
MultiplePipelineを実施したくて調べて来た方はごめんなさい、解決していないです。
結論
経緯としては、Logstashで処理するデータ送信元や格納先インデックスが増えて来たため、MultiplePipelinesにしてパイプライン定義ファイルもパイプライン単位で独立させ、パイプラインの独立性と、パイプライン定義ファイルの可読性を上げようと思いました。
結果、MultiplePipelineではどうにもうまくデータが入らなかったため、パイプラインの分割は諦め、mainパイプラインのみとし、パイプライン定義ファイルの可読性向上のみ実施しました。
以下作成中。後で清書します
環境や設計
- Logstash 7.6らへん
- 対象データはFilebeatのみ
- 格納先インデックスは、「システム名-ログ名-年月」で設定
- IndexTemplateやKibanaでは「システム名-*」「システム名-ログ名-*」でインデックスパターンを設定
変更前の設定値
パイプライン定義ファイル「input-filebeat.conf」
input {
beats {
port => 5044
}
}filter {
※全てのログの分m必要なフィルターを定義(3パターンくらいしかログがなく、基本grokフィルターでの処理のみなので、特に条件分岐なし)
}
output{
if システム==A
if ログ名==A {
※インデックス「filebeat-システム名-ログ名-年月」に格納
}
(中略)
}
やったこと
設計
パイプラインを以下のように流れるように変更
- パイプライン「input-filebeat」でinputにFilebeatのデータ取得を行い、outputで個別のパイプライン「filter-システム名-ログ名」に送信する
- 個別の「input-filebeat」で、ログ毎に必要なFilterを実行し、outputで個別のインデックス「filebeat-システム名-ログ名-年月」に格納する
手順
/etc/logstash/logstash.yml
以下のようにpath.configのコメントアウトを実施します。これを実施しないとpipelines.ymlが読み込まれません。
# path.config: /etc/logstash/conf.d/*.conf
/etc/logstash/pipelines.yml
- pipeline.id: input-filebeat
path.config: "/etc/logstash/conf.d/input-filebeat.conf"
- pipeline.id: filter-systemA-LogA
path.config: "/etc/logstash/conf.d/filter-systemA-LogA.conf"
queue.type: persisted
パイプライン定義ファイル「input-filebeat.conf」
input {
beats {
port => 5044
}
}output{
if システム==A
if ログ名==A {
pipelines { send_to => "filter-systemA-LogA" }
}
(中略)
}
パイプライン定義ファイル「filter-systemA-LogA.conf」
input {
pipeline { address => "filter-systemA-LogA" }
}filter {
※ログ毎に必要なフィルターを定義
}
output {
※インデックス「filebeat-システム名-ログ名-年月」に格納
}
参考
想定した結果
設計通りに動く
設計
パイプラインを以下のように流れるように変更
- パイプライン「input-filebeat」でinputにFilebeatのデータ取得を行い、outputで個別のパイプライン「filter-システム名-ログ名」に送信する
- 個別の「input-filebeat」で、ログ毎に必要なFilterを実行し、outputで個別のインデックス「filebeat-システム名-ログ名-年月」に格納する
実際の結果
インデックスにデータが格納されない状態になりました。
※後日、具体的なエラーメッセージ貼り付けます
代わりにやったこと
logstash.ymlやpipelines.ymlはデフォルト設定に戻し、パイプライン定義ファイルの可読性向上や、誤ったフィルターが適用されないよう、ログの出力形式毎に条件分岐を定義
filterにもoutputにも同じ条件分岐を載せるので書きっぷりは冗長になりましたが、今後ログの種類や量が増える予定なので、Filter部分の可読性を優先してこういう感じにしました。
パイプライン定義ファイル「input-filebeat.conf」
input {
beats {
port => 5044
}
}output{
if システム==A
if ログ名==A {
pipelines { send_to => "filter-systemA-LogA" }
}
(中略)
}
パイプライン定義ファイル「filter-systemA-LogA.conf」
filter {
if システム==A
if ログ名==A {
※ログ毎に必要なフィルターを定義
}
}
後書き
パイプラインが一つだけなのは、今後支障が出そうなので、おいおいMultiplePipelinesは調べないとと思ってます