如何在logstash / grok中从文本文件行中解析json?

12

我有一个像这样的日志文件(简化版)

日志行示例

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

我想提取包含在data中的json,并创建两个字段,一个为firstname,一个为last。但是,我得到的输出结果是这样的:

{"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"}}

这不是我需要的,我需要在Kibana中为名字和姓氏创建字段,但是Logstash没有使用Json过滤器提取这些字段。

Logstash配置

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"
    }   
}
任何帮助将不胜感激,我相信我错过了一些简单的东西。
谢谢。
1个回答

22
在你的json过滤器之后,添加另一个称为mutate的过滤器,以添加从parsedJson字段中获取的两个字段。
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"
}

2
你的示例在“firstname”和姓氏后面有一个冗余的“}”,即%{[parsedJson][firstname]}}",这将会使它无法正常工作。 - BornToCode
谢谢 @BornToCode 修复了 ;-) - Val

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接