正規表現を使用したif
ステートメントがlogstashでどのように見えるか、誰にも教えてもらえますか?
私の試み:
if [fieldname] =~ /^[0-9]*$/
if [fieldname] =~ "^[0-9]*$"
どちらも機能しません。
私がやろうとしているのは、「フィールド名」に整数が含まれているかどうかをチェックすることです
他の答えを結合してまとまりのある答えにする。
最初の形式は正しいように見えますが、正規表現は希望どおりに動作していません。
/^[0-9]*$/
一致:
^
:行の始まり
[0-9]*
:0回以上の任意の数字
$
:行の終わり
したがって、正規表現は、数字だけで構成される行をキャプチャします。単に1つ以上の数字を含むフィールドで一致させるには、/[0-9]+/
または/\d+/
これは同等であり、それぞれが行の残りに関係なく1桁以上の数字に一致します。
合計で次のものが必要です。
if [fieldname] =~ /\d+/ {
# do stuff
}
最も簡単な方法は、\d
if [fieldname] =~ /\d+/ {
...
}
^
は、文字列の開始位置をアサートします
$
は、文字列の末尾の位置を表明します
正規表現は数値文字列と一致するだけで、チェックには整数が含まれている必要があり、^
と$
を削除します。
最初の形式が機能します(執筆時点で私にとって)。
以下の抜粋で現在のlogstashバージョンを確認し、一致時に出力に存在するuuid
フィールドも監視します。予想どおり、空のフィールドも一致しますが、それ以外は完全です。
このような短いstdin-stdout構成でテストすることをお勧めします。 LogstashとElasticのものは素晴らしいですが、多くの場合、コーナーケースはドキュメントで適切に議論されていません。彼らは私たち全員が誘惑されるので、ドキュメントよりも速くコードを開発します。
============= logstash @ logstash.Host.example.com : ~ ============
$ cfg="$(cat)"
input { stdin {} }
filter { if [message] =~ /^[0-9]*$/ { uuid { target => "uuid" } } }
output { stdout { codec => "rubydebug" } }
============= logstash @ logstash.Host.example.com : ~ ============
$ /usr/share/logstash/bin/logstash --config.string "$cfg" --pipeline.workers 1 --log.format json --path.data /tmp/kadmar
WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
Could not find log4j2 configuration at path /usr/share/logstash/config/log4j2.properties. Using default config which logs errors to the console
[WARN ] 2018-11-26 14:50:36.434 [LogStash::Runner] multilocal - Ignoring the 'pipelines.yml' file because modules or command line options are specified
[INFO ] 2018-11-26 14:50:37.646 [LogStash::Runner] runner - Starting Logstash {"logstash.version"=>"6.3.0"}
[INFO ] 2018-11-26 14:50:44.490 [Converge PipelineAction::Create<main>] pipeline - Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>1, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50}
[INFO ] 2018-11-26 14:50:44.840 [Converge PipelineAction::Create<main>] pipeline - Pipeline started successfully {:pipeline_id=>"main", :thread=>"#<Thread:0x4620459c run>"}
The stdin plugin is now waiting for input:
[INFO ] 2018-11-26 14:50:45.048 [Ruby-0-Thread-1: /usr/share/logstash/lib/bootstrap/environment.rb:6] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[INFO ] 2018-11-26 14:50:45.457 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9601}
hello
{
"message" => "hello",
"@timestamp" => 2018-11-26T13:50:56.293Z,
"Host" => "logstash.Host.example.com",
"@version" => "1"
}
ab123cd
{
"message" => "ab123cd",
"@timestamp" => 2018-11-26T13:51:13.648Z,
"Host" => "logstash.Host.example.com",
"@version" => "1"
}
123
{
"message" => "123",
"uuid" => "3cac8b35-6054-4e14-b7d0-0036210c1f2b",
"@timestamp" => 2018-11-26T13:51:18.100Z,
"Host" => "logstash.Host.example.com",
"@version" => "1"
}
1
{
"message" => "1",
"uuid" => "1d56982f-421a-4ccd-90d6-6c2c0bcf267d",
"@timestamp" => 2018-11-26T13:51:25.631Z,
"Host" => "logstash.Host.example.com",
"@version" => "1"
}
{
"message" => "",
"uuid" => "747ac36f-8679-4c66-8050-9bd874aef4c5",
"@timestamp" => 2018-11-26T13:51:27.614Z,
"Host" => "logstash.Host.example.com",
"@version" => "1"
}
012 456
{
"message" => "012 456",
"@timestamp" => 2018-11-26T13:52:09.614Z,
"Host" => "logstash.Host.example.com",
"@version" => "1"
}
この正規表現(と括弧、私は思う)が必要です。
if ([fieldname] =~ /^[0-9]+$/)