皆さん、こんにちは。
タイトルの通りlogstashのconfigファイルに引数を渡して
filterプラグインを制御、実行したいと考えています。
コマンドライン又は別の方法でconfファイルへ引数を渡すことは可能なのでしょうか?
可能であれば引数の渡し方とconfファイル内の記述例をご提示いただければ嬉しく思います。
例ですが、現在は下記のようにconfを指定し、logstashを起動しています。
bin\logstash.bat agent -f logstash.conf"
よろしくお願い致します。
nxhack
February 9, 2016, 3:49am
2
johtani
(Jun Ohtani)
February 22, 2016, 12:55am
3
「filterプラグインの制御」と言われているのはどんな感じなんでしょうか?
例えば、configファイルを別々にするという方法ではダメですか?
引数をどういう形で利用するのかがよくわからないので。
Filterの切り替えなどという意味であれば、configファイルを個別にするのが一つかと。
あとは、すでに提案がありますが、environment filterの利用もありかと。
あとは、別途、configをテンプレート化しておいて、スクリプト(batファイル)で、
読み込んだテンプレート化されたconfigから、config文字列を作って、"-e"オプションで、設定を文字列で渡す方法もあるかと。
nxhack様
立て込んでましてお返事遅れました。
ありがとうございます。
環境変数というのは
%{host} ※マシン名
とか、このことでしょうか?
もし任意に
%{GroupNo}
などを宣言してconf内で利用できるのであれば
環境変数を1つの解決策として確認してみたいと思います。
ただ、logstashは個人様のサイトで紹介されている手法を見ながらなので
使い方の勉強が追い付いていません。
公式ドキュメントを見てみました。
見落としがあったかもしれませんが、環境変数の記述を見つけきれませんでした。
可能であれば記述されているURLか
サンプルコード等ありましたら教えていただけると大変助かります。
順序がおかしくなりましたが、
今回お伺いしたのは下記のようにPCごとに任意の情報をログ情報に付与し
elasticsearch側で判別したいためです。
※任意の情報はレジストリやテキストなど、別の媒体でPC内に保持し、
logstash起動時にテンプレート化したconfに任意情報を設定したい。
filter {
mutate {
add_field => {
"GroupNo" => "%{GroupNo}"
}
}
}
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 =>
もう少し試してみようかと思います。
実現したい形に近づいたのですが、上手くいかなかったので
整理も兼ねて具体的に説明と質問をしたいと思います。
現在の環境は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の環境変数なのか、違う環境変数のことなのかもわかっていません。
お手数かけますが、よろしくお願いします。
nxhack
March 3, 2016, 7:34am
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"]
"
}