web-dev-qa-db-ja.com

正規表現を使用したLogstash ifステートメントの例

正規表現を使用したifステートメントがlogstashでどのように見えるか、誰にも教えてもらえますか?

私の試み:

if [fieldname] =~ /^[0-9]*$/

if [fieldname] =~ "^[0-9]*$"

どちらも機能しません。

私がやろうとしているのは、「フィールド名」に整数が含まれているかどうかをチェックすることです

13
Shawn Sim

他の答えを結合してまとまりのある答えにする。

最初の形式は正しいように見えますが、正規表現は希望どおりに動作していません。

/^[0-9]*$/一致:

^:行の始まり

[0-9]*:0回以上の任意の数字

$:行の終わり

したがって、正規表現は、数字だけで構成される行をキャプチャします。単に1つ以上の数字を含むフィールドで一致させるには、/[0-9]+/または/\d+/これは同等であり、それぞれが行の残りに関係なく1桁以上の数字に一致します。

合計で次のものが必要です。

if [fieldname] =~ /\d+/ {
   # do stuff
}
15
Will Barnwell

最も簡単な方法は、\d

if [fieldname] =~ /\d+/ {
   ...
}
3
Val

^は、文字列の開始位置をアサートします

$は、文字列の末尾の位置を表明します

正規表現は数値文字列と一致するだけで、チェックには整数が含まれている必要があり、^$を削除します。

3
Kerwin

最初の形式が機能します(執筆時点で私にとって)。

以下の抜粋で現在の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"
}
1
marcingo

この正規表現(と括弧、私は思う)が必要です。

if ([fieldname] =~ /^[0-9]+$/)
0
Bohemian