logstash(2.3.2)gzip编解码器不起作用

use*_*253 3 plugins codec logstash

我正在使用logstash(2.3.2)通过使用gzip_lines编解码器来读取gz文件.日志文件示例(sample.log)是

127.0.0.2 - - [11/Dec/2013:00:01:45 -0800] "GET /xampp/status.php HTTP/1.1" 200 3891 "http://cadenza/xampp/navi.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0"
Run Code Online (Sandbox Code Playgroud)

我用来附加到gz文件的命令是:

cat sample.log | gzip -c >> s.gz
Run Code Online (Sandbox Code Playgroud)

logstash.conf是

input { 
  file {
    path => "./logstash-2.3.2/bin/s.gz"
    codec => gzip_lines { charset => "ISO-8859-1"}
  }
}

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
    #match => { "message" => "message: %{GREEDYDATA}" }
  }
  #date {
  #  match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
  #}
}


output {
  stdout { codec => rubydebug }
}
Run Code Online (Sandbox Code Playgroud)

我用bin/logstash-plugin安装了logzash-codec-gzip_lines安装了gzip_line插件

使用./logstash -f logstash.conf启动logstash

当我用cat sample.log |提供s.gz时 gzip -c >> s.gz

我希望控制台打印数据.但没有什么打印出来的.

我在mac和ubuntu上尝试过,得到了相同的结果.我的代码有什么问题吗?

alp*_*ert 7

我检查了代码,gzip_lines我觉得这个插件不起作用.至少对于2.3.2版本.可能是它已经过时了.因为它没有实现此处指定的方法:

https://www.elastic.co/guide/en/logstash/2.3/_how_to_write_a_logstash_codec_plugin.html

所以目前的内部工作是这样的:

  • file 输入插件逐行读取文件并将其发送到编解码器.
  • gzip_lines 编解码器尝试使用GzipReader.new(io)创建新的GzipReader对象
  • 然后逐行浏览读者以创建事件.

因为您指定了一个gzip文件,所以file输入插件会尝试将gzip文件作为常规文件读取并将行发送到编解码器.Codec尝试使用该字符串创建GzipReader,但它失败了.

您可以将其修改为以下方式:

创建一个包含gzip文件列表的文件:

-- list.txt
/path/to/gzip/s.gz 
Run Code Online (Sandbox Code Playgroud)

将它提供给文件输入插件:

file {
    path => "/path/to/list/list.txt"
    codec => gzip_lines { charset => "ISO-8859-1"}
}
Run Code Online (Sandbox Code Playgroud)

变化是:

打开vendor/bundle/jruby/1.9/gems/logstash-codec-gzip_lines-2.0.4/lib/logstash/codecs/gzip_lines.r文件.添加register方法:

public
def register
  @converter = LogStash::Util::Charset.new(@charset)
  @converter.logger = @logger
end
Run Code Online (Sandbox Code Playgroud)

并在方法decode更改:

@decoder = Zlib::GzipReader.new(data)
Run Code Online (Sandbox Code Playgroud)

@decoder = Zlib::GzipReader.open(data)
Run Code Online (Sandbox Code Playgroud)

这种方法的缺点是它不会拖尾你的gzip文件而是列表文件.因此,您需要创建一个新的gzip文件并将其附加到列表中.