2014-09-22 313 views
10

因此,我有一個Web平臺,每個包含有關該請求的日誌數據的請求都會打印一個JSON文件。我可以配置幾個關於什麼時候應該記錄東西的規則,只有在某些級別,等等......將JSON文件導入Logstash + Elasticsearch + Kibana

現在,我一直在玩Logstash + Elasticsearch + Kibana3堆棧,我很想找到一種方法在Kibana中查看這些日誌。我的問題是,有沒有辦法讓Logstash導入這些類型的文件,還是我必須爲它編寫一個自定義輸入插件?我搜索了一下,看到了我所看到的,插件是用Ruby編寫的,這是一種我沒有經驗的語言。

回答

10

Logstash只是一個將各種syslog文件轉換爲JSON並將它們加載到elasticsearch(或graphite,或...)中的工具。

由於您的文件已經在JSON中,因此不需要logstash。您可以使用curl將它們直接上傳到elasticsearch。

Import/Index a JSON file into Elasticsearch

然而,爲了與Kibana很好地工作,你的JSON文件需要在最低限度。

  1. Flat-Kibana沒有挖掘嵌套的JSON結構。你需要一個簡單的鍵/值對散列。

  2. 有一個可識別的時間戳。

我建議看看JSON文件logstash輸出,看看你是否可以按摩你的JSON文件來匹配那個結構。你可以用你支持JSON的 這樣的語言來做到這一點。程序jq對於將json從一種格式過濾到另一種格式非常方便。

Logstash格式 - https://gist.github.com/jordansissel/2996677

JQ - http://stedolan.github.io/jq/

+0

我們說logstash無法處理大量帶有單個JSON條目的文件嗎?否則,現在您必須確定是否存在超過1行,使用curl,否則導入到Logstash中。當然,單行文件與Logstash的觀點沒有什麼不同? – 2014-10-09 18:49:36

+0

我對logstash和json文件沒有提及。我只是說,如果logstash無法做到你想做的事情,並且如果數據已經在JSON中,那麼做logstash的做法是相當簡單的。 – 2014-10-10 23:53:55

1

Logstash可以導入不同的格式和來源,因爲它提供了很多插件。還有其他的日誌收集器和轉發工具,可以發送日誌到logstash,如nxlog,rsyslog,syslog-ng,flume,kafka,fluentd等等。據我所知,大多數人在windows上使用nxlog(儘管它適用於linux),因爲它的資源佔用少。 (免責聲明:我隸屬於該項目)

14

Logstash是處理動態文件一個很好的工具。

下面是一個使用logstash導入您的JSON文件到elasticsearch方式:

配置文件:

{"foo":"bar", "bar": "foo"} 
{"hello":"world", "goodnight": "moon"} 

注意JSON必須是:JSON文件的

input 
{ 
    file 
    { 
     path => ["/path/to/json/file"] 
     start_position => "beginning" 
     sincedb_path => "/dev/null" 
     exclude => "*.gz" 
    } 
} 

filter 
{ 
    mutate 
    { 
     replace => [ "message", "%{message}" ] 
     gsub => [ 'message','\n',''] 
    } 
    if [message] =~ /^{.*}$/ 
    { 
     json { source => message } 
    } 

} 

output 
{ 
    elasticsearch { 
    protocol => "http" 
    codec => json 
    host => "localhost" 
    index => "json" 
    embedded => true 
    } 

    stdout { codec => rubydebug } 
} 

例子在一行中。如果你想解析多行json文件,請替換配置文件中的相關字段:

input 
{ 
    file 
    { 
     codec => multiline 
     { 
      pattern => '^\{' 
      negate => true 
      what => previous     
     } 
     path => ["/opt/mount/ELK/json/*.json"] 
     start_position => "beginning" 
     sincedb_path => "/dev/null" 
     exclude => "*.gz" 
    } 
} 

filter 
{ 
    mutate 
    { 
     replace => [ "message", "%{message}}" ] 
     gsub => [ 'message','\n',''] 
    } 
    if [message] =~ /^{.*}$/ 
    { 
     json { source => message } 
    } 

} 
+0

第一種配置不起作用。 :response => {「create」=> {「_ index」=>「fb」,「_type」=>「logs」,「_id」=>「AVZUyqwOVPEDPgwGc4_k」,「status」=> 400,「error」=> {「type」=>「mapper_parsing_exception」,「reason」=>「解析失敗」,「causes_by」=> {「type」=>「illegal_state_exception」,「reason」=>「混合字段類型:class org。 elasticsearch.index.mapper.core.StringFieldMapper $ StringFieldType!= class org.elasticsearch.index.mapper.internal.IdFieldMapper $ IdFieldType on field _id「}}}},:level =>:warn} – KevinOelen 2016-08-04 09:04:04

相關問題