logstash(2.3.2) gzip 编解码器不工作
logstash(2.3.2) gzip codec not work
我正在使用 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 }
}
我已经安装了 gzip_line 插件 bin/logstash-plugin install logstash-codec-gzip_lines
用 ./logstash -f 启动 logstash logstash.conf
当我用 s.gz 喂食时
猫 sample.log | gzip -c >> s.gz
我希望控制台打印数据。但是什么也没有打印出来。
我已经在 mac 和 ubuntu 上试过了,得到了相同的结果。
我的代码有什么问题吗?
我检查了 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 对象
- 然后它逐行通过 reader 来创建事件。
因为您指定了一个 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 文件并将其附加到列表中。
我遇到了这个问题的变体,我需要将文件中的字节解码为中间字符串,以便为只接受字符串的进程输入做准备。
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....
我正在使用 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 }
}
我已经安装了 gzip_line 插件 bin/logstash-plugin install logstash-codec-gzip_lines
用 ./logstash -f 启动 logstash logstash.conf
当我用 s.gz 喂食时 猫 sample.log | gzip -c >> s.gz
我希望控制台打印数据。但是什么也没有打印出来。
我已经在 mac 和 ubuntu 上试过了,得到了相同的结果。 我的代码有什么问题吗?
我检查了 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 对象
- 然后它逐行通过 reader 来创建事件。
因为您指定了一个 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 文件并将其附加到列表中。
我遇到了这个问题的变体,我需要将文件中的字节解码为中间字符串,以便为只接受字符串的进程输入做准备。
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....