Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在logstash配置文件中引用环境变量?_Logstash - Fatal编程技术网

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

如何在logstash配置文件中引用环境变量?,logstash,Logstash,是否可以在logstash配置中引用环境变量 在我的例子中,我想让我的elasticsearch地址可以配置,我已经在环境中设置好了。这不是直接支持的,不是 但是,如果您运行的是1.4.0之后的版本,那么编辑elasticsearch.rb以添加此功能将非常简单。大约: 您可以调整它以读取环境变量: if ENV["ESHOST"].nil? then client_settings["network.host"] = ENV["ESHOST"] else client_sett

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


在我的例子中,我想让我的elasticsearch地址可以配置,我已经在环境中设置好了。

这不是直接支持的,不是

但是,如果您运行的是1.4.0之后的版本,那么编辑
elasticsearch.rb
以添加此功能将非常简单。大约:

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

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传递config。您可以在某个文件中使用您已用环境变量替换的特殊标记
cat

撰写本文时的日志存储配置只是一个配置文件,但它不是一种编程语言。因此,它有一些合理的“限制”,例如,它不能引用环境变量,不能向它传递参数,难以重用其他配置文件。当配置文件增长或需要动态调整其行为时,这些限制将使logstash配置文件难以维护

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

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

output {
  elasticsearch {
    index => {{ es_index_name }}
    host => {{ es_hostname }}
  }
}
然后,我使用Jinja2编写了一个简单的python代码来生成logstash配置文件,es_index_name和es_hostname的值可以通过python脚本参数传递。有关Jiaja2教程,请参见此处:


通过这种方式,一个大的日志存储配置可以拆分为可重用的部分,其行为可以动态调整。

我几乎不相信,剩下的解决方案只有这些:破解日志存储或使用某种模板系统重新编写配置

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

我真诚地希望有人能想出一个更好的主意,比如


%{ENV[ELASTICSEARCH\u HOST]}

使用logstash 2.3,可以使用${var}或$var将环境变量引用设置到logstash插件配置中。

在Logstash2.3之前,您可以使用社区维护的“环境”过滤器插件

文件位于:

如何安装此插件:

$LOGSTASH_HOME/bin/plugin install 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
编码:utf-8 需要“日志存储/过滤器/基础” 需要“日志存储/命名空间” #从环境变量设置字段 类LogStash::Filters::Environmentenvironment`变量的匹配项哈希 config:add_field_from_env,:validate=>:hash,:default=>{} 公众的 def寄存器 #没什么 结束#def寄存器 公众的 def过滤器(事件) 除非过滤,否则返回?(事件) @从_env.each do添加| field _,env| 事件[字段]=环境[环境] 结束 过滤器匹配(事件) 结束#def过滤器 end#类LogStash::Filters::Environment 如中所述

连接是在插件注册时建立的(在初始化期间,几乎可以肯定应该是这样),但字段插值(如
%{escluster}
)是一种事件处理时操作。因此,
host
实际上不适合这种行为


因此,除非输入或输出插件本机支持
%{foo}
语法,否则在事件筛选阶段执行任何环境变量评估对于输入和输出插件来说都太晚了,无法利用它。

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

export EXAMPLE_VAR=123
并以以下方式在配置文件中使用它:

${EXAMPLE_VAR}

谢谢,很高兴知道,将尝试我的具体情况。但我相信一个通用的解决方案,允许任何参数(主机、端口、模式等)都很好,不要为此道歉。Logstash配置可以有if/then/else块、regexp匹配设置和内部变量(“字段”)的解析等等,这使得它非常像一种编程语言。依赖于系统文件路径而不接受这些路径中的环境变量是一个巨大的疏忽。。。一点也不“合理”Hi-Rhubarb,logstash配置文件确实支持if/else,引用内部字段。这些都是有用的特性。但是,不支持以下用例:1)引用外部变量,如问题中的情况。2) 不能包含另一个日志存储文件。3) 不支持循环。这就是为什么它导致使用模板引擎来做这件事。在我的例子中,我需要这些特性来使logstash conf文件可重用和可维护。让我知道你对此的建议,我很想尝试一下。嗨,这个答案不再有效,因为logstash现在可以处理环境变量see。现在,我通过一个简单的ruby脚本解决了这个问题,该脚本进行替换。远不能令人满意,但对我们的设置有效,至少我们没有使用大炮来完成这样简单的事情…请添加更多的上下文并更直接地解决问题。
${EXAMPLE_VAR}