使用docker在命令行上指定logstash配置

时间:2017-12-02 10:49:19

标签: docker elasticsearch logstash

Stashing your first event的Logstash 6.0文档显示了以下命令,使用简单的管道运行logstash,该管道只是将stdin管道传输到stdout:

$ bin/logstash -e 'input { stdin { } } output { stdout {} }'

但是,当从官方docker容器运行logstash时,这不起作用,并且失败并显示有关不兼容的命令行选项的错误消息:

$ docker run --rm -it docker.elastic.co/logstash/logstash-oss:6.0.0 \
  -e 'input { stdin { } } output { stdout {} }'
ERROR: Settings 'path.config' (-f) and 'config.string' (-e) can't be used simultaneously.

我没有指定-fpath.config。我只是想测试是否可以启动logstash并且正在为这个简单的情况工作。如何在不挂载配置文件的情况下解决此错误?

2 个答案:

答案 0 :(得分:6)

查看logstash docker镜像中的启动脚本,可以在logstash-core/lib/logstash/runner.rb文件中找到以下函数:

# where can I find the logstash.yml file?
# 1. look for a "--path.settings path"
# 2. look for a "--path.settings=path"
# 3. check if the LS_SETTINGS_DIR environment variable is set
# 4. return nil if not found
def fetch_settings_path(cli_args)
  if i=cli_args.find_index("--path.settings")
    cli_args[i+1]
  elsif settings_arg = cli_args.find {|v| v.match(/--path.settings=/) }
    match = settings_arg.match(/--path.settings=(.*)/)
    match[1]
  elsif ENV['LS_SETTINGS_DIR']
    ENV['LS_SETTINGS_DIR']
  else
    nil
  end
end

因此,解决方案似乎要么通过--path.settings== - 语法为空值),要么将LS_SETTINGs_DIR变量设置为假值。事实上:

$ docker run --rm -it docker.elastic.co/logstash/logstash-oss:6.0.0 \
  --path.settings= -e 'input { stdin { } } output { stdout { } }'
The stdin plugin is now waiting for input:

答案 1 :(得分:0)

正如Knittl所说 - 为logstash设置咨询了路径设置,这些设置位于logstash.yml文件中,看起来像这样(取自docker.elastic.co/logstash/logstash:6.1.2 image:

http.host: "0.0.0.0" path.config: /usr/share/logstash/pipeline xpack.monitoring.elasticsearch.url: http://elasticsearch:9200 xpack.monitoring.elasticsearch.username: logstash_system xpack.monitoring.elasticsearch.password: changeme

问题是path.config指向仅包含默认logstash.conf的目录。

没有副作用的解决方案是:

$ docker run --rm -it docker.elastic.co/logstash/logstash-oss:6.0.0 \ --path.config="" -e 'input { stdin { } } output { stdout { } }'

这样,logstash.yml中的其他设置将保持不变。