【问题标题】:execute ruby as pipeline input for logstash执行 ruby​​ 作为 logstash 的管道输入
【发布时间】:2016-09-04 19:48:50
【问题描述】:

Logstash 允许 executing arbitrary commands 作为管道的输入。 这是我的示例管道:

input {
  exec {
    command => '/usr/bin/ruby -e "puts RUBY_VERSION"'
    interval => 10
  }
}

output {
  stdout { codec => rubydebug }
}

这样我得到以下错误:

/opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/resolver.rb:328:in `block in verify_gemfile_dependencies_are_found!': Could not find gem 'logstash-core (= 2.4.0) ruby' in any of the gem sources listed in your Gemfile or installed on this machine. (Bundler::GemNotFound)
        from /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/resolver.rb:307:in `each'
        from /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/resolver.rb:307:in `verify_gemfile_dependencies_are_found!'
        from /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/resolver.rb:199:in `start'
        from /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/resolver.rb:182:in `resolve'
        from /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/definition.rb:192:in `resolve'
        from /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/definition.rb:132:in `specs'
        from /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/definition.rb:177:in `specs_for'
        from /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/definition.rb:166:in `requested_specs'
        from /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/environment.rb:18:in `requested_specs'
        from /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/runtime.rb:13:in `setup'
        from /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler.rb:122:in `setup'
        from /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/setup.rb:18:in `<top (required)>'
        from /usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'

我还尝试像这样在 exec 中运行 logstash 自己的 JRuby

input {
  exec {
    command => '/opt/logstash/vendor/jruby/bin/jruby -e "puts RUBY_VERSION"'
    interval => 10
  }
}

output {
  stdout { codec => rubydebug }
}

它会产生另一个 Bundler 错误:

Bundler::GemNotFound: Could not find gem 'ci_reporter_rspec (= 1.0.0) java' in any of the gem sources listed in your Gemfile or installed on this machine.
  verify_gemfile_dependencies_are_found! at /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/resolver.rb:328
                                    each at org/jruby/RubyArray.java:1613
  verify_gemfile_dependencies_are_found! at /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/resolver.rb:307
                                   start at /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/resolver.rb:199
                                 resolve at /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/resolver.rb:182
                                 resolve at /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/definition.rb:192
                                   specs at /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/definition.rb:132
                               specs_for at /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/definition.rb:177
                         requested_specs at /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/definition.rb:166
                         requested_specs at /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/environment.rb:18
                                   setup at /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/runtime.rb:13
                                   setup at /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler.rb:122
                                  (root) at /opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/setup.rb:18
                                 require at org/jruby/RubyKernel.java:1040
                                  (root) at /opt/logstash/vendor/jruby/lib/ruby/shared/rubygems/core_ext/kernel_require.rb:1

Logstash 继续运行,管道每 10 秒执行一次,但消息始终为空。尝试执行像echo "hello" 这样的其他命令没有问题。

在logstash 2.4.0上运行,openjdk版本“1.8.0_102”,系统ruby是Archlinux ARM上的MRI 2.3.1。

有什么想法吗?

【问题讨论】:

  • 你试过运行bundle install吗?
  • 是的,logstash 安装正确,当我不尝试运行 ruby​​ 命令时它可以工作
  • /opt/logstash/vendor/jruby/bin 目录中是否有bundle 可执行文件?如果你要使用一些ruby库,我宁愿使用自己的jruby安装而不是logstash打包的。
  • 您需要使用 exec 输入,还是可以使用 tcp 输入并将您的 ruby​​ 脚本作为单独的进程运行?
  • @dieter 是的。再次:logstash 与我的所有其他管道完美配合。我想我会为 logstash 提交一个错误。

标签: ruby logstash logstash-configuration


【解决方案1】:

看起来您可能需要切换到 JRuby 而不是 MRI,这对于 Logstash 是实验性的,而不是 currently supported。您可以考虑使用RVMrbenv,它们可以帮助管理不同的Ruby 版本,并根据需要在shell 中在JRuby 和native 之间切换。

一旦你使用了 JRuby + bundler (gem install bundler),你可以从项目根目录bundle install 并且你的依赖问题应该得到解决。

【讨论】:

  • 我试过了,但没有成功。我在logstash的jruby env中安装了我的脚本的依赖项,并使用相同的jruby运行我的脚本,但它仍然没有工作。使用 jruby 示例查看更新后的问题
  • 再次,它与logstash 或我的命令无关,因为我不使用任何库(参见问题中的示例)。 logstash 也适用于所有其他管道。
  • 看起来进展不错。对于相同的错误消息,您可以看到这个 logstash 问题。 Gemfile.lock 中是否列出了宝石?编辑:删除重建说明
  • 通过使用嵌入的 jruby,bundler 默认被所有 Gemfile 依赖调用。 Logstash 不附带ci_reporter_rspec,因为它在:development 组中,因此出现错误。您可以在source code here 中看到它,它反映了错误日志中的这一行:/opt/logstash/vendor/bundle/jruby/1.9/gems/bundler-1.9.10/lib/bundler/setup.rb:18。我认为最好的方法是使用 jruby 调用 Ruby 命令
猜你喜欢
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多