Logstash un-gzip 数组日志配置
Logstash un-gzip array log configuration
各位!
我有 logstash 配置,它将日志从 RabbitMQ 转发到 elasticSearch。像这样:
input {
rabbitmq {
...
}
}
filter {
if [type] == "rabbitmq" {
json {
source => "message"
target => "message"
}
}
}
output {
elasticsearch {
hosts => ["${ES_HOST}"]
user => "${ES_USERNAME}"
password => "${ES_PASSWORD}"
sniffing => false
index => "kit_events-%{[message][elasticsearch][index]}"
}
}
而且我们被迫即时压缩日志,因为它们消耗了太多流量。
日志被移动到数组中并压缩。
配置解压缩并将数组拆分回对象的正确方法是什么?
我做了一些研究,发现有 gzip_lines 插件和 Ruby(?) 上的一些东西来解析数组,但我没有实现它。以前有人做过这样的东西吗?
更新:
添加了这个过滤器
filter {
if [type] == "kitlog-rabbitmq" {
ruby {
init => "
require 'zlib'
require 'stringio'
"
code => "
body = event.get('[http][response][body]').to_s
sio = StringIO.new(body)
gz = Zlib::GzipReader.new(sio)
result = gz.read.to_s
event.set('[http][response][body]', result)
"
}
}
}
现在发现一个错误
ERROR][logstash.filters.ruby ] Ruby exception occurred: not in gzip format
[DEBUG][logstash.pipeline ] output received {"event"=>{"@timestamp"=>2018-11-30T09:16:19.127Z, "tags"=>["_rubyexception"], "@version"=>"1", "message"=>"x^\x8B\xAEV*\xCE\xCE\xCC\xC9)V\xB2R\x88V\xD26T07\xB7\xB0\xB4\xB44000W\x8A\xD5QPJ\xCE\xCF+IL.\u0001\xCA*)\u0001\xB9\xA9\xB9\x89\x999 N\x96C\x96^r~.X,\xA5\u0014(R\xADT\x9A\u000E6#\xA0\xB2$#?\u000F\xAC\xB9\u0000\\"\xE2\u001C\xAC\u0014[\v\xE4\xE6%概\xF4z\u0001\xE9b%\xA0\xC8\xC0\xD9\u001D\v\u0000\u0003\x9ADk", "type"=>"kitlog-rabbitmq"}}
尝试了不同的 gzip 压缩方法,但结果仍然相同。还尝试更改输入编解码器(普通 - utf-8,普通 - 二进制)
所以 rabbitmq 中的内容是压缩的?
在最好的情况下,logstash 会看到 content-encoding
header 并为您解压缩,但 plugin doesn't seem to do anything with that knowledge. You might request 功能。
该插件允许您访问 header,因此您可以自己执行 gzip。像这样:
filter {
if [@metadata][rabbitmq_properties][content-encoding] == "gzip" {
ruby {
...
}
}
}
使用 ruby exist elsewhere 解压缩字符串的示例。希望 'zip' gem 在 logstash 中可用。
各位! 我有 logstash 配置,它将日志从 RabbitMQ 转发到 elasticSearch。像这样:
input {
rabbitmq {
...
}
}
filter {
if [type] == "rabbitmq" {
json {
source => "message"
target => "message"
}
}
}
output {
elasticsearch {
hosts => ["${ES_HOST}"]
user => "${ES_USERNAME}"
password => "${ES_PASSWORD}"
sniffing => false
index => "kit_events-%{[message][elasticsearch][index]}"
}
}
而且我们被迫即时压缩日志,因为它们消耗了太多流量。 日志被移动到数组中并压缩。 配置解压缩并将数组拆分回对象的正确方法是什么?
我做了一些研究,发现有 gzip_lines 插件和 Ruby(?) 上的一些东西来解析数组,但我没有实现它。以前有人做过这样的东西吗?
更新:
添加了这个过滤器
filter {
if [type] == "kitlog-rabbitmq" {
ruby {
init => "
require 'zlib'
require 'stringio'
"
code => "
body = event.get('[http][response][body]').to_s
sio = StringIO.new(body)
gz = Zlib::GzipReader.new(sio)
result = gz.read.to_s
event.set('[http][response][body]', result)
"
}
}
}
现在发现一个错误
ERROR][logstash.filters.ruby ] Ruby exception occurred: not in gzip format
[DEBUG][logstash.pipeline ] output received {"event"=>{"@timestamp"=>2018-11-30T09:16:19.127Z, "tags"=>["_rubyexception"], "@version"=>"1", "message"=>"x^\x8B\xAEV*\xCE\xCE\xCC\xC9)V\xB2R\x88V\xD26T07\xB7\xB0\xB4\xB44000W\x8A\xD5QPJ\xCE\xCF+IL.\u0001\xCA*)\u0001\xB9\xA9\xB9\x89\x999 N\x96C\x96^r~.X,\xA5\u0014(R\xADT\x9A\u000E6#\xA0\xB2$#?\u000F\xAC\xB9\u0000\\"\xE2\u001C\xAC\u0014[\v\xE4\xE6%概\xF4z\u0001\xE9b%\xA0\xC8\xC0\xD9\u001D\v\u0000\u0003\x9ADk", "type"=>"kitlog-rabbitmq"}}
尝试了不同的 gzip 压缩方法,但结果仍然相同。还尝试更改输入编解码器(普通 - utf-8,普通 - 二进制)
所以 rabbitmq 中的内容是压缩的?
在最好的情况下,logstash 会看到 content-encoding
header 并为您解压缩,但 plugin doesn't seem to do anything with that knowledge. You might request 功能。
该插件允许您访问 header,因此您可以自己执行 gzip。像这样:
filter {
if [@metadata][rabbitmq_properties][content-encoding] == "gzip" {
ruby {
...
}
}
}
使用 ruby exist elsewhere 解压缩字符串的示例。希望 'zip' gem 在 logstash 中可用。