2017-04-03 368 views
2

我想用logstash将数据导入elasticsearch。数据是压缩格式,因为它是一个大数据。
这里是我到目前为止已经试过:如何使用logstash将压缩的json导入elasticsearch?

input { 
    file { 
    path => "C:/Users/lenovo-pc/Desktop/test.zip" 
    start_position => "beginning" 
    type=> "mytest" 
    codec => "gzip_lines" 
    }  
} 

filter { 
    json { source => "message" } 
} 

output { 
    elasticsearch { 
    hosts => ["localhost:9200"] 
    index => "testing" 
    } 
    stdout { codec => rubydebug } 
} 

我跑logstash -f import.conf后得到了什么,是在这里:

Could not find log4j2 configuration at path /Bitnami/elk-5.2.2-0/logstash/config/log4j2.properties. Using default config which logs to console 
13:53:11.640 [main] FATAL logstash.runner - An unexpected error occurred! {:error=>#<ArgumentError: Could not coerce (9600-9700) into a port range>, :backtrace=>["C:/Bitnami/elk-5.2.2-0/logstash/logstash-core/lib/logstash/settings.rb:352:in `coerce'", "C:/Bitnami/elk-5.2.2-0/logstash/logstash-core/lib/logstash/settings.rb:237:in `set'", "C:/Bitnami/elk-5.2.2-0/logstash/logstash-core/lib/logstash/settings.rb:61:in `set_value'", "C:/Bitnami/elk-5.2.2-0/logstash/logstash-core/lib/logstash/settings.rb:80:in `merge'", "org/jruby/RubyHash.java:1342:in `each'", "C:/Bitnami/elk-5.2.2-0/logstash/logstash-core/lib/logstash/settings.rb:80:in `merge'", "C:/Bitnami/elk-5.2.2-0/logstash/logstash-core/lib/logstash/settings.rb:115:in `validate_all'", "C:/Bitnami/elk-5.2.2-0/logstash/logstash-core/lib/logstash/runner.rb:210:in `execute'", "C:/Bitnami/elk-5.2.2-0/logstash/vendor/bundle/jruby/1.9/gems/clamp-0.6.5/lib/clamp/command.rb:67:in `run'", "C:/Bitnami/elk-5.2.2-0/logstash/logstash-core/lib/logstash/runner.rb:183:in `run'", "C:/Bitnami/elk-5.2.2-0/logstash/vendor/bundle/jruby/1.9/gems/clamp-0.6.5/lib/clamp/command.rb:132:in `run'", "C:\\Bitnami\\elk-5.2.2-0\\logstash\\lib\\bootstrap\\environment.rb:71:in `(root)'"]} 

好心帮我解决这个问题。

样品我test.zip文件:Check here

+0

你能分享一个简单的文件,我可以试试。我怀疑这个问题不是来自zip文件。 – Adonis

+0

@asettouf好的让我编辑共享示例的问题。 –

+0

请检查编辑后的问题 –

回答

1

gzipzip是两个不同的压缩方法。 gzip格式只支持一个文件,而zip是一个容器格式。没有用于logstash的zip编解码器。您需要使用另一个编解码器来指定压缩文件内部的文件的编解码器,而logstash对此没有任何概念。有一个JIRA支持S3输入,但它仍然是开放的。

要处理.zip文件中的文件,您将不得不依赖logstash外部的某些内容来为您提取文件,然后使用file输入来处理提取的文件。

+0

在这种情况下,使用Logstash的exec插件使用'unzip -c archive.zip file1.txt file2.txt'应该可以工作(尽管在Linux操作系统上),不是吗? – Adonis

+0

@asettouf对不起,我不明白。你是否说我需要在我的logstash配置文件中写入'unzip',然后将其导入到elasticsearch中。这是你的上下文吗? –

+0

@JafferWilson你可以用exec插件解决这个限制,看我的答案 – Adonis

0

一点点添加到@ Alcanzar的答案,因为你不能直接使用gzip的插件,一个变通方法(仅适用于Linux操作系统,它可能会用命令行工具如Cygwin的或Git的bash的工作在Windows上支持unzip命令)将使用exec plugin解压缩存档文件到标准输出,一个简单的测试与跟随着的conf:

input { 
    exec { 
    command => "unzip -q -c tt.zip" 
    interval => 10 
    } 
} 

output { 
    stdout { codec => rubydebug } 
} 

和含2个文本文件的zip文件包含一个行(世界你好1和Hello世界2)给我们输出:

{ 
     "message" => "hello world 1\nhello world 2\n", 
     "@version" => "1", 
    "@timestamp" => "2017-04-04T08:04:56.024Z", 
      "host" => "de0-vsiaas-1129", 
     "command" => "unzip -q -c tt.zip" 
} 

这绝对是可行的,尽管通过一些解决方法。