web-dev-qa-db-ja.com

テキストファイルの行からlogstash / grokのjsonを解析する方法は?

このようなログファイルがあります(簡略化)

ログラインサンプル

MyLine data={"firstname":"bob","lastname":"the builder"}

dataに含まれるjsonを抽出し、firstnameとlastの2つのフィールドを作成したいと思います。しかし、私が得る出力はこれです:

{"message":"Line data={\"firstname\":\"bob\",\"lastname\":\"the builder\"}\r","@version":"1","@timestamp":"2015-11-26T11:38:56.700Z","Host":"xxx","path":"C:/logstashold/bin/input.txt","MyWord":"Line","parsedJson":{"firstname":"bob","lastname":"the builder"}}

ご覧のように

..."parsedJson":{"firstname":"bob","lastname":"the builder"}}

それは私が必要なものではありません。キバナの名と姓のフィールドを作成する必要がありますが、logstashはjsonフィルターでフィールドを抽出していません。

LogStash Config

input {
  file {
        path => "C:/logstashold/bin/input.txt"        
       }
}

filter {     

   grok {
            match => { "message" => "%{Word:MyWord} data=%{GREEDYDATA:request}"}        
        }   

    json{
        source => "request"
        target => "parsedJson"
        remove_field=>["request"]
    }   
}   

output {  
    file{
        path => "C:/logstashold/bin/output.txt"
    }   
}

どんな助けも大歓迎です、私は簡単なものを見逃していると確信しています

ありがとう

10
bingbon

jsonフィルターの後に、 mutate という別のフィルターを追加して、parsedJsonフィールドから取得する2つのフィールドを追加します。

filter {
  ...
  json {
     ...
  }
  mutate {
    add_field => {
      "firstname" => "%{[parsedJson][firstname]}"
      "lastname" => "%{[parsedJson][lastname]}"
    }
  }
}

上記のサンプルログ行では、次のようになります。

{
       "message" => "MyLine data={\"firstname\":\"bob\",\"lastname\":\"the builder\"}",
      "@version" => "1",
    "@timestamp" => "2015-11-26T11:54:52.556Z",
          "Host" => "iMac.local",
        "MyWord" => "MyLine",
    "parsedJson" => {
        "firstname" => "bob",
         "lastname" => "the builder"
    },
     "firstname" => "bob",
      "lastname" => "the builder"
}
19
Val