1. 程式人生 > >logstash使用之json輸入輸出

logstash使用之json輸入輸出

概述

如果傳送給logstash的資料內容為json格式,那麼可以通過解析json內容,根據具體內容生成欄位.方便分析和儲存,比如:

有一個json內容為: {"name":"nihao"},我們需要獲取這個記錄然後通過logstash分析後,放到mysql資料庫中.

一個簡單的logstash輸出內容為:

{
      "@version" => "1",
          "host" => "localhost",
    "@timestamp" => 2017-11-23T08:40:16.868Z,
       "message" => "{\"name\":\"nihao\"}"
}

也就是說,如果存到資料庫中,會儲存以上四個欄位到表中,而我們的記錄的內容被簡單的記錄到message欄位中,如果我們需要分析這條
記錄,還得自己取出來進行處理.

如果使用了logstash的json解析,那麼會是這個樣子:

{
      "@version" => "1",
          "host" => "localhost",
    "@timestamp" => 2017-11-23T08:40:16.868Z,
       "message" => "name=nihao",
       "name" => "nihao"
}

這樣存到資料庫中就多了name

欄位,分析這條記錄的時候只要取出來就可以.如果不想要message欄位,也可以省去:

{
      "@version" => "1",
          "host" => "localhost",
    "@timestamp" => 2017-11-23T08:40:16.868Z,
       "name" => "nihao"
}

json輸出

如果將一個輸入的記錄處理後,輸出為json串:

比如輸入: “nihao”,

那麼輸出的結果為:

{"@version":"1","host":"localhost","@timestamp
":"2017-11-23T09:42:14.798Z","message":"nihao"}

配置資訊如下:

input {
    stdin{}
}
output{
    stdout{
        codec => json
    }
}

除了輸入的內容外,還添加了一些額外的資訊.

使用

logstash處理json輸入有兩種方式:
* 直接在輸入階段進行處理
* 通過過濾器處理

配置

輸入階段處理

json_input_log.conf

input{
        stdin{
            codec => json
        }
}
output{
        stdout{codec => rubydebug}
}
過濾階段處理

json_filter_log.conf

input{
        stdin{}
}
filter{
    json{
        source => "message"
    }
}
output{
        stdout{codec => rubydebug}
}

可以看到,輸入階段處理是通過codec對輸入內容進行處理,過濾階段通過json過濾器外掛進行處理

結果

輸入階段處理
{"name":"hewe"}
{
          "name" => "hewe",
      "@version" => "1",
          "host" => "localhost",
    "@timestamp" => 2017-11-23T09:09:01.533Z
}
過濾階段處理
{"name":"hewe"}
{
      "@version" => "1",
          "host" => "localhost",
          "name" => "hewe",
    "@timestamp" => 2017-11-23T09:05:12.004Z,
       "message" => "{\"name\":\"hewe\"}"
}
注意

雖然開啟除錯顯示的內容和json相似,但這只是除錯顯示的內容,資料在logstash中儲存可能是一個物件,或者一個集合.具體輸出json還是xml由output決定

通過以上的對比,可以看到,過濾階段比輸入階段多了一個欄位message,這也就表明,當在輸入階段處理時,是直接把輸入的內容解析成相應的欄位,
而在過濾階段處理時,輸入的內容已經被放到message欄位中,然後通過設定source解析message為相應的欄位.

結語

具體使用哪一種分情況而定.