如何在logstash配置文件中引用环境变量?

时间:2014-06-02 17:18:58

标签: logstash

是否可以在logstash配置中引用环境变量?

在我的情况下,我想让我的弹性搜索地址可配置,我已在环境中设置。

6 个答案:

答案 0 :(得分:8)

使用logstash 2.3,您可以使用$ {var}或$ var将环境变量引用设置为Logstash插件配置。 https://www.elastic.co/guide/en/logstash/current/environment-variables.html

在logstash 2.3之前,您可以使用"环境"过滤插件,这是社区维护的。

文档:https://www.elastic.co/guide/en/logstash/current/plugins-filters-environment.html#plugins-filters-environment-add_field_from_env

如何安装此插件:

$LOGSTASH_HOME/bin/plugin install logstash-filter-environment

源代码:https://github.com/logstash-plugins/logstash-filter-environment

主要部分是:

# encoding: utf-8
require "logstash/filters/base"
require "logstash/namespace"


# Set fields from environment variables
class LogStash::Filters::Environment < LogStash::Filters::Base
  config_name "environment"

  # Specify a hash of fields to the environment variable
  # A hash of matches of `field => environment` variable
  config :add_field_from_env, :validate => :hash, :default => {}

  public
  def register
    # Nothing
  end # def register

  public
  def filter(event)
    return unless filter?(event)
    @add_field_from_env.each do |field, env|
      event[field] = ENV[env]
    end
    filter_matched(event)
  end # def filter
end # class LogStash::Filters::Environment

答案 1 :(得分:6)

我简直不敢相信,这些是唯一的解决方案:黑客logstash或使用某种模板系统来重新编写配置。

实际上,我不想为不同的部署场景触摸或调整配置:我想要的是传递一些参数来将logstash连接到外部世界(例如,elasticsearch所在的位置,用户名/连接到的凭据)其他系统)。我用谷歌搜索了一个小时,我能找到的就是这个非常简单和常见问题的这些笨拙复杂的解决方案。

我真诚地希望,有人能提出更好的想法,比如

%{ENV[ELASTICSEARCH_HOST]}}

答案 2 :(得分:5)

没有直接支持,没有。

但是,如果您运行的版本高于1.4.0,则编辑elasticsearch.rb以添加此功能将非常简单。大约line 183

client_settings["network.host"] = @bind_host if @bind_host

您可以调整它以读取环境变量:

if ENV["ESHOST"].nil? then
    client_settings["network.host"] = ENV["ESHOST"]
else
    client_settings["network.host"] = @bind_host if @bind_host
end

如果您愿意,可以使用-e命令行选项运行Logstash,以通过STDIN传递配置。您可以cat在某个文件中使用您已用环境变量替换的特殊标记。

答案 3 :(得分:3)

撰写本文时的logstash配置只是一个配置文件,但它不是编程语言。因此,它有一些合理的限制&#34;,例如,它不能引用环境变量,不能传递参数,很难重用其他配置文件。这些限制会使配置文件增长时难以维护logstash配置文件,或者您希望动态调整其行为。

我的方法是使用模板引擎生成logstash配置文件。我在Python中使用了Jinja2。

例如,弹性搜索输出可以模板化为

output {
  elasticsearch {
    index => {{ es_index_name }}
    host => {{ es_hostname }}
  }
}

然后我使用Jinja2编写了一个简单的python代码来生成logstash配置文件,es_index_name和es_hostname的值可以通过Python脚本参数传递。请参阅此处了解Jiaja2教程:http://kagerato.net/articles/software/libraries/jinja-quickstart.html

通过这种方式,可以将大型logstash配置拆分为可重用的部分,并且可以动态调整其行为。

答案 4 :(得分:1)

logstash-issues

中所述
  

在插件注册时建立连接(在初始化期间,因为它们几乎肯定应该是这样),但是字段插值(如%{escluster})是一个事件处理时间操作。因此,host并不真正符合此行为。

因此,除非输入或输出插件本身支持%{foo}语法,否则在事件过滤阶段进行任何环境变量评估对于输入和输出插件来说都太晚了。

答案 5 :(得分:0)

.conf文件支持环境变量。  您只需要导出环境变量:

export EXAMPLE_VAR=123

并以这种方式在配置文件中使用它:

${EXAMPLE_VAR}