簡體   English   中英

在logstash中使用grok解析多行JSON

[英]Parse multiline JSON with grok in logstash

我有一個格式的JSON:

{
    "SOURCE":"Source A",
    "Model":"ModelABC",
    "Qty":"3"
}

我正在嘗試使用logstash解析此JSON。 基本上我希望logstash輸出是一個key:value對的列表,我可以使用kibana進行分析。 我認為這可以開箱即用。 從很多閱讀中,我明白我必須使用grok插件(我仍然不確定json插件的用途)。 但我無法獲得所有領域的活動。 我得到多個事件(甚至對於我的JSON的每個屬性都有一個)。 像這樣:

{
       "message" => "  \"SOURCE\": \"Source A\",",
      "@version" => "1",
    "@timestamp" => "2014-08-31T01:26:23.432Z",
          "type" => "my-json",
          "tags" => [
        [0] "tag-json"
    ],
          "host" => "myserver.example.com",
          "path" => "/opt/mount/ELK/json/mytestjson.json"
}
{
       "message" => "  \"Model\": \"ModelABC\",",
      "@version" => "1",
    "@timestamp" => "2014-08-31T01:26:23.438Z",
          "type" => "my-json",
          "tags" => [
        [0] "tag-json"
    ],
          "host" => "myserver.example.com",
          "path" => "/opt/mount/ELK/json/mytestjson.json"
}
{
       "message" => "  \"Qty\": \"3\",",
      "@version" => "1",
    "@timestamp" => "2014-08-31T01:26:23.438Z",
          "type" => "my-json",
          "tags" => [
        [0] "tag-json"
    ],
          "host" => "myserver.example.com",
          "path" => "/opt/mount/ELK/json/mytestjson.json"
}

我應該使用多行編解碼器還是json_lines編解碼器? 如果是這樣,我該怎么做? 我是否需要編寫自己的grok模式,或者是否存在一些JSON的通用內容,這些內容將為我提供一個具有鍵值的事件:我在上面的一個事件中得到的值對? 我找不到任何能夠揭示這一點的文件。 任何幫助,將不勝感激。 我的conf文件如下所示:

input
{
        file
        {
                type => "my-json"
                path => ["/opt/mount/ELK/json/mytestjson.json"]
                codec => json
                tags => "tag-json"
        }
}

filter
{
   if [type] == "my-json"
   {
        date { locale => "en"  match => [ "RECEIVE-TIMESTAMP", "yyyy-mm-dd HH:mm:ss" ] }
   }
}

output
{
        elasticsearch
        {
                host => localhost
        }
        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 }
    }

}

output 
{ 
    stdout { codec => rubydebug }
}

我的mutliline編解碼器不處理最后一個大括號,因此它不會顯示為json { source => message }的JSON。 因此mutate過濾器:

replace => [ "message", "%{message}}" ]

這增加了缺失的支撐。

gsub => [ 'message','\n','']

刪除引入的\\n字符。 最后,我有一個可以通過json { source => message }讀取的單行JSON

如果有一種更簡潔/更簡單的方法將原始多行JSON轉換為單行JSON,請執行POST,因為我覺得上面的內容不太干凈。

您需要使用multiline編解碼器。

input {
  file {
    codec => multiline {
        pattern => '^{'
        negate => true
        what => previous
    }
    path => ['/opt/mount/ELK/json/mytestjson.json']
  }
}
filter {
  json {
    source => message
    remove_field => message
  }
}

您將遇到的問題與文件中的最后一個事件有關。 它不會出現,直到文件中有另一個事件(所以基本上你將丟失文件中的最后一個事件) - 你可以在文件被輪換之前附加一個{來處理這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM