Logstash.confに引数渡してlogstash起動


#1

皆さん、こんにちは。

タイトルの通りlogstashのconfigファイルに引数を渡して
filterプラグインを制御、実行したいと考えています。

コマンドライン又は別の方法でconfファイルへ引数を渡すことは可能なのでしょうか?
可能であれば引数の渡し方とconfファイル内の記述例をご提示いただければ嬉しく思います。

例ですが、現在は下記のようにconfを指定し、logstashを起動しています。
bin\logstash.bat agent -f logstash.conf"

よろしくお願い致します。


#2

直接の回答ではないのですが、コミュニティ プラグインで、 environment filter があります。

https://www.elastic.co/guide/en/logstash/current/plugins-filters-environment.html#plugins-filters-environment

環境変数で渡してあげる手もありそうです。


(Jun Ohtani) #3

「filterプラグインの制御」と言われているのはどんな感じなんでしょうか?
例えば、configファイルを別々にするという方法ではダメですか?
引数をどういう形で利用するのかがよくわからないので。

Filterの切り替えなどという意味であれば、configファイルを個別にするのが一つかと。
あとは、すでに提案がありますが、environment filterの利用もありかと。

あとは、別途、configをテンプレート化しておいて、スクリプト(batファイル)で、
読み込んだテンプレート化されたconfigから、config文字列を作って、"-e"オプションで、設定を文字列で渡す方法もあるかと。


#4

nxhack様

立て込んでましてお返事遅れました。
ありがとうございます。

環境変数というのは
%{host} ※マシン名
とか、このことでしょうか?

もし任意に
%{GroupNo}
などを宣言してconf内で利用できるのであれば
環境変数を1つの解決策として確認してみたいと思います。

ただ、logstashは個人様のサイトで紹介されている手法を見ながらなので
使い方の勉強が追い付いていません。
公式ドキュメントを見てみました。
見落としがあったかもしれませんが、環境変数の記述を見つけきれませんでした。

可能であれば記述されているURLか
サンプルコード等ありましたら教えていただけると大変助かります。

順序がおかしくなりましたが、
今回お伺いしたのは下記のようにPCごとに任意の情報をログ情報に付与し
elasticsearch側で判別したいためです。
※任意の情報はレジストリやテキストなど、別の媒体でPC内に保持し、
logstash起動時にテンプレート化したconfに任意情報を設定したい。

 filter {
 	mutate {
 	  add_field => {
 	    "GroupNo" => "%{GroupNo}"
 	  }
 	}
 }

#5

Jun Ohtani 様

立て込んでましてお返事遅れました。
ありがとうございます。

filterプラグインの使いたい内容については[nxhack様]へのレスに書かせてもらいましたが、
mutateの値をconfigに直接設定ではなく、logstash呼び出し時に動的に値を渡したかったです。

解決策としては
nxhack様から教えていただいた環境変数か

あとは、別途、configをテンプレート化しておいて、スクリプト(batファイル)で、
読み込んだテンプレート化されたconfigから、config文字列を作って、"-e"オプションで、設定を文字列で渡す方法もあるかと。

上記内容を試してみたところ
教えていただいた内容とやり方が違うかもしれませんが、下記方法でやりたいことが出来ました。

rem コマンドで logstash.bat "1" で実行

rem 
SET GroupNo=%1

cd "logstash.batがあるディレクトリ"

logstash.bat -e " input {stdin{}}  filter {mutate {add_field => {"GroupNo" => %GroupNo%}}} output {stdout {codec =>rubydebug }}"

上記スクリプトで

io/console not supported; tty will not be manipulated
Logstash startup completed
test
{
       "message" => "test\r",
      "@version" => "1",
    "@timestamp" => "2016-02-25T03:19:20.056Z",
          "host" => "sample",
       "GroupNo" => "1"
}

という結果を得られました。

本来は、
"input ~~~~rubydebug }}"
の部分をconfigファイルとして別に管理したかったのですが、
その形にして、スクリプトから読み込み実行すると下記エラーがでます。
Error: Expected one of #, ", ', -, [, { at line 1, column 61 (byte 61) after filter { mutate { add_field => { test =>

もう少し試してみようかと思います。


#6

実現したい形に近づいたのですが、上手くいかなかったので
整理も兼ねて具体的に説明と質問をしたいと思います。

現在の環境はlogstash実行batを実行してlogstashを起動しています。

logstash実行bat
bin/logstash.bat agent -f logstash.config

logstash.config

input{
file など
}

filter{
  mutate{
    add_field => {
      "GroupID" => aaaa-bb
      "GroupNo" => 1
    }
  }
}

output{
file など
}

実現したいポイントは
logstash.config内のmutateでadd_fieldしている
GroupNoの値をconfigファイル内に直接記述するのではなく
今の提案でいうところの環境変数を記述し、設定値を固定化したい。
イメージとしてはconfigファイルで
"GroupNo" => 環境変数
というようにしたい。

理由は
サーバ上で管理しているlogstash.configの内容を変更したら
全PCにlogstash.configを配布上書きし、同じ設定を反映させたいためです。

ただし、そのまま上書きしてしまうと
PC個別に管理している"GroupNo"の値も上書きされてしまうため、
上書きされても問題がないよう、
レジストリなどで別管理している"GroupNo"の値を設定したいためです。
※configファイルの"GroupNo"ごとに個別管理は運用上無理がある。

もしこれを実現できるのが「環境変数」であれば
やり方をお教えいただければと思います。

現在Windows上で行っているのですが
環境変数がWindowsの環境変数なのか、違う環境変数のことなのかもわかっていません。

お手数かけますが、よろしくお願いします。


#7

コードは無検証ですが、ruby filter を使うのはどうでしょうか。

 ruby {
     code => "
         require 'win32/registry'
         key = 'Software\aurantiacus\somevalue' 
         reg = Win32::Registry::HKEY_LOCAL_MACHINE.open(key) 
         event['GroupID'] = reg["GroupID"] 
         event['GroupNo'] = reg["GroupNo"] 
    "
  }

(system) #8