Quelqu'un peut-il me montrer à quoi ressemble une instruction if
avec une expression rationnelle dans logstash?
Mes tentatives:
if [fieldname] =~ /^[0-9]*$/
if [fieldname] =~ "^[0-9]*$"
Aucun des deux ne fonctionne.
Ce que j'ai l'intention de faire est de vérifier si le "nom de champ" contient un entier
Pour combiner les autres réponses en une réponse cohérente.
Votre premier format semble correct, mais votre expression régulière ne fait pas ce que vous voulez.
/^[0-9]*$/
allumettes:
^
: le début de la ligne
[0-9]*
: n'importe quel chiffre 0 fois ou plus
$
: La fin de la ligne
Ainsi, votre expression régulière capture des lignes qui sont exclusivement composées de chiffres. Pour faire correspondre le champ contenant simplement un ou plusieurs chiffres quelque part, essayez d'utiliser /[0-9]+/
ou /\d+/
qui sont équivalents et correspondent chacun à un ou plusieurs chiffres, quel que soit le reste de la ligne.
Au total, vous devriez avoir:
if [fieldname] =~ /\d+/ {
# do stuff
}
Le moyen le plus simple consiste à vérifier \d
if [fieldname] =~ /\d+/ {
...
}
^
affirme la position au début de la chaîne
$
affirme la position à la fin de la chaîne
Votre expression rationnelle correspond simplement à la chaîne numérique, et la vérification contient un entier doit être supprimé ^
et $
.
Votre premier format fonctionne (pour moi au moment de la rédaction).
Vérifiez la version actuelle de logstash dans l'extrait ci-dessous, et surveillez également le champ uuid
présent dans la sortie lors de la correspondance. Comme prévu, le champ vide correspond également, mais sinon c'est parfait.
Je vous suggère de tester des trucs avec des configurations stdin-stdout aussi courtes. Logstash et Elastic sont excellents, mais trop souvent, les cas d'angle ne sont pas correctement traités dans la documentation. Ils développent du code plus rapidement que les documents car nous sommes tous tentés.
============= 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"
}
Vous avez besoin de cette expression régulière (et des crochets, je pense):
if ([fieldname] =~ /^[0-9]+$/)