如何在Logstash 5.X中使用环境变量?

时间:2017-02-16 14:46:49

标签: logstash

我们刚刚从2.X切换到5.X,我试图找出如何在管道配置文件中使用环境变量。

在2.X中,以下工作:

export HOSTNAME

然后使用--allow-env命令行标志启动Logstash。管道配置文件如下所示:

filter {
       mutate {
              add_field => { "some_field" => "${HOSTNAME}"}
       }
}

文档说不再需要--allow-env标志了。

我已尝试将mutate替换为environment过滤器,但没有运气。

我已尝试编辑startup.options文件。添加HOSTNAME作为常规环境变量,并将其添加到read-EOM部分之间,但没有任何正面结果。

如果我将以下部分添加到/usr/share/logstash/bin/logstash.lib.sh文件中,现在似乎有效,但我确定我是否应该编辑它。

HOSTNAME="the-name-of-the-host"
export HOSTNAME

所以我的问题是:我忽略了什么?在Logstash的管道配置文件中允许使用环境变量的正确方法是什么?

注意:

就像Alcanzar所描述的那样,如果我手动运行Logstash,这是有效的。但是我们希望用systemctl运行它,因此它应该在启动时由守护程序自动启动。在2.X中,它与/etc/init.d/logstash文件一起工作正常,但正如documentation所描述的那样,现在已经没有了。我应该编辑的文件是:/etc/logstash/startup.options/etc/logstash/logstash.yml

2 个答案:

答案 0 :(得分:0)

如果手动启动,环境变量显然有效:

使用test.conf:

input {
    stdin { codec => "json" }
}
filter {
    mutate {
        add_field => {
            "hostname" => "${HOSTNAME}"
        }
    }
}

output {
    stdout { codec => "rubydebug" }
}

我们可以运行测试并验证它:

% export HOSTNAME="abc1234" 
% echo '{"a":1}' | bin/logstash -f test.conf
Sending Logstash's logs to /Users/xxxxxx/logstash-5.1.1/logs which is now configured via log4j2.properties
[2017-02-16T09:04:33,442][INFO ][logstash.inputs.stdin    ] Automatically switching from json to json_lines codec {:plugin=>"stdin"}
[2017-02-16T09:04:33,454][INFO ][logstash.pipeline        ] Starting pipeline {"id"=>"main", "pipeline.workers"=>8, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>1000}
[2017-02-16T09:04:33,457][INFO ][logstash.pipeline        ] Pipeline main started
[2017-02-16T09:04:33,492][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}
{
             "a" => 1,
      "hostname" => "abc1234",
    "@timestamp" => 2017-02-16T15:04:33.497Z,
      "@version" => "1",
          "host" => "XXXXXX.local",
          "tags" => []
}
[2017-02-16T09:04:36,472][WARN ][logstash.agent           ] stopping pipeline {:id=>"main"}

所以真正的问题是为什么它不适用于您的场景。如果您使用某种/etc/init.d脚本来启动logstash,那么您可以向/etc/sysconfig/logstash添加一行export HOSTNAME="whatever"

答案 1 :(得分:0)

我们遇到了与logstash 5相同的问题。最好的方法(我们发现)是在/etc/systemd/system/logstash.service.d/override.conf中添加env vars并且在那里有

   [Service]
   Environment="HOSTNAME=the-name-of-the-host"