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

如何在logstash5.X中使用环境变量?,logstash,Logstash,我们刚刚从2.X切换到5.X,我正在尝试了解如何在管道配置文件中使用环境变量 在2.X中,以下各项起了作用: export HOSTNAME 然后用--allow env命令行标志启动Logstash。管道配置文件如下所示: filter { mutate { add_field => { "some_field" => "${HOSTNAME}"} } } 文档说明不再需要--allow env标志 我试图用环境过滤器替换

我们刚刚从2.X切换到5.X,我正在尝试了解如何在管道配置文件中使用环境变量

在2.X中,以下各项起了作用:

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

filter {
       mutate {
              add_field => { "some_field" => "${HOSTNAME}"}
       }
}
文档说明不再需要
--allow env
标志

我试图用
环境
过滤器替换
变异
,但没有成功

我试图编辑
startup.options
文件。添加了
HOSTNAME
作为常用环境变量,并将其添加到
读取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
文件,但正如所描述的,这已经不复存在了。我应该编辑的文件是:
/etc/logstash/startup.options
/etc/logstash/logstash.yml

如果手动启动,环境变量显然可以工作:

使用以下内容的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=“where”

我们对logstash 5也有同样的问题。(我们发现)最好的方法是在/etc/systemd/system/logstash.service.d/override.conf中添加env变量,并在其中添加

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

是的,你完全正确。我忘了提到我们想用systemctl命令运行它。文档中提到了
/etc/logstash/startup.options
文件和
/etc/logstash/logstash.yml
,因此我添加了您之前提到的代码行,但没有任何运气。我想这可能会告诉您如何为systemd设置环境变量--我不使用systemd,但信息看起来很可靠