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

日志示例

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

我想提取包含在 数据 中的 json 并创建两个字段,一个用于名字,一个用于最后。但是,我得到的输出是这样的:
{"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"
    }
}

非常感谢任何帮助,我确定我错过了一些简单的东西

谢谢

最佳答案

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

关于elasticsearch - 如何从文本文件行解析 logstash/grok 中的 json?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33937936/

10-17 03:05