【问题标题】:logstash(2.3.2) gzip codec not worklogstash(2.3.2) gzip 编解码器不起作用
【发布时间】:2016-07-26 03:19:09
【问题描述】:

我正在使用 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"

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

cat sample.log | gzip -c >> s.gz

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 }
}

我已经使用 bin/logstash-plugin install logstash-codec-gzip_lines 安装了 gzip_line 插件

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

当我喂 s.gz 时 猫样本.log | gzip -c >> s.gz

我希望控制台打印数据。但没有打印出来。

我在 mac 和 ubuntu 上都试过了,结果是一样的。 我的代码有什么问题吗?

【问题讨论】:

    标签: plugins logstash codec


    【解决方案1】:

    我检查了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 文件作为常规文件读取并将行发送到编解码器。编解码器尝试使用该字符串创建 GzipReader,但它失败了。

    你可以修改它来像这样工作:

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

    -- list.txt
    /path/to/gzip/s.gz 
    

    把它交给文件输入插件:

    file {
        path => "/path/to/list/list.txt"
        codec => gzip_lines { charset => "ISO-8859-1"}
    }
    

    变化是:

    打开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
    

    并在方法decode 中更改:

    @decoder = Zlib::GzipReader.new(data)
    

    作为

    @decoder = Zlib::GzipReader.open(data)
    

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

    【讨论】:

      【解决方案2】:

      我遇到了这个问题的一个变种,我需要将文件中的字节解码为中间字符串,以准备只接受字符串的进程输入。

      在 Pyhton 2 中忽略编码/解码问题的事实实际上是非常糟糕的恕我直言。您最终可能会遇到各种损坏的数据问题,尤其是当您需要将字符串重新编码回数据时。

      使用 ISO-8859-1 适用于 gz 和文本文件。而 utf-8 仅适用于文本文件。我还没有尝试过png。

      这是一个对我有用的例子

              data = os.read(src, bytes_needed)
              chunk += codecs.decode(data,'ISO-8859-1')
              # do the needful with the chunk....
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-11
        • 1970-01-01
        • 2016-11-12
        • 2014-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-08
        相关资源
        最近更新 更多