最新在使用Lostash2.3.4收集數據的時候,在讀取redis數據的時候,報了以下的一個異常:git
Pipeline aborted due to error {:exception=>#<URI::InvalidURIError: the scheme redis does not accept registry part: redis_master_10214 (or bad hostname?)>, :backtrace=>["/home/search/logstash-2.3.4/vendor/jruby/lib/ruby/1.9/uri/generic.rb:214:in `initialize'"
Logstash自帶的ruby是1.9的版本,自帶集成的redis插件也是最新的redis-rb3.3.1github
Logstash裏面默認自帶了redis插件,也就是redis-rb3.3.1redis
若是沒帶能夠進入logstash目錄:docker
logstash-2.3.4\vendor\jruby\bin進行安裝ruby
cd logstash-2.3.4\vendor\jruby\bin gem install redis
若是redis採用的是哨兵模式的集羣,那麼redis-rb插件也是支持的,具體的看官網github文檔:dom
https://github.com/redis/redis-rbui
logstash的代碼以下:url
input{ stdin{} } filter{ ruby{ init => " require 'redis' class Rconn @@SENTINELS = [{:host => '192.168.10.214', :port => 26381}, {:host => '192.168.10.214', :port => 26382}, {:host => '192.168.10.214', :port => 26383}] def self.con @@con end def self.SENTINELS @@SENTINELS end @@con = Redis.new(:url => 'redis://redismaster10214', :sentinels => Rconn.SENTINELS, :role => :master) end " code => " event['redis_data']=Rconn.con.get(event['message']) " } } output{ stdout { codec => rubydebug } }
:url => 'redis://redismaster10214'
redis的哨兵masterName在ruby1.9中必須不能帶下劃線,不然會報下面的異常:插件
:url => 'redis://redis_master_10214'
<URI::InvalidURIError: the scheme redis does not accept registry part: redis_master_10214 (or bad hostname?)>,
ruby裏面的標準的url校驗,發現url裏面若是有帶下劃線的,會認爲是不合法的url,具體可參考下面兩個問題鏈接:debug
https://github.com/docker/compose/issues/472
http://stackoverflow.com/questions/2180465/can-domain-name-subdomains-have-an-underscore-in-it
目前在ruby1.9的版本中發現此bug,使用最新的版本ruby2.3.0則沒有此問題,說明在高版本的ruby中 已經修復了此問題,可是logstash最新的版本綁定的jruby版本是1.9的ruby,因此還存在此問題,只能在使用時避免,真是血淚教訓,花費了大半天時間趟的坑。