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

时间:2016-05-07 01:08:16

标签: plugins logstash codec

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

public static void main(String[] args) {
    SwingUtilities.invokeLater( () -> {
        JFrame frame = new JFrame();
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setVisible(true);             // <<-- Window becomes visible here
        pixel = new Pixel(1600, 900);
        frame.getContentPane().add(pixel);  // <<-- Safe - running on EDT.
        pixel.testChange();  // <<-- Also safe - running on EDT
    });
}

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

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"

logstash.conf是

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

我已经使用bin / logstash-plugin install logstash-codec-gzip_lines

安装了gzip_line插件

使用./logstash -f logstash.conf

启动logstash

当我用s.gz喂食时 cat sample.log | gzip -c&gt;&gt; s.gz

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

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

2 个答案:

答案 0 :(得分:7)

我检查了file的代码,我觉得这个插件无效。至少对于2.3.2版本。可能是它已经过时了。因为它没有实现这里指定的方法:

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

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

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

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

您可以将其修改为:

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

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)

作为

{{1}}

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

答案 1 :(得分:0)

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

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

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

这是一个对我有用的例子

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