Logstash - 不会解析JSON

时间:2014-07-17 14:03:38

标签: json elasticsearch logstash

我希望使用Logstash将parse数据发送到Elasticsearch。到目前为止,这很有效,但是当我尝试解析JSON文件时,Logstash不会做任何事情。我可以毫无例外地启动Logstash但它不会解析任何东西。

我的配置有问题吗? JSON文件的路径是正确的。

我的JSON:

{
  "stats": [
    {
      "liveStatistic": {
        "@scope": "21",
        "@scopeType": "foo",
        "@name": "minTime",
        "@interval": "60",
        "lastChange": "2011-01-11T15:19:53.259+02:00",
        "start": "2011-01-18T14:19:48.333+02:00",
        "unit": "s",
        "value": 10
      }
    },
    {
      "liveStatistic": {
        "@scope": "26",
        "@scopeType": "bar",
        "@name": "newCount",
        "@interval": "60",
        "lastChange": "2014-01-11T15:19:59.894+02:00",
        "start": "2014-01-12T14:19:48.333+02:00",
        "unit": 1,
        "value": 5
      }
    },
    ...
  ]
}

我的Logstash代理配置:

input {
  file {
    path => "/home/me/logstash-1.4.2/values/stats.json"
    codec => "json"
    start_position => "beginning"
  }
}

output {
  elasticsearch {
    host => localhost
    protocol =>"http"
  }
  stdout { 
    codec => rubydebug 
  }
}

2 个答案:

答案 0 :(得分:3)

您应该在输入中添加以下行:

start_position => "beginning"

同样将完整的文档放在一行上,并在文档周围添加{},使其成为有效的json文档。

答案 1 :(得分:1)

好的,有两件事:

首先,file输入默认设置为在文件末尾开始读取。如果您希望文件在开头读取,则需要设置start_position。例如:

file {
    path => "/mypath/myfile"
    codec => "json"
    start_position => "beginning"
}

其次,请记住logstash会保留一个sincedb文件,该文件记录您已读取的文件的行数(以便不重复解析信息!)。这通常是一个理想的功能,但是对于静态文件的测试(这看起来像你正在尝试做的那样),那么你想要解决这个问题。我知道有两种方法。

一种方法是,每次要运行logstash时都可以创建该文件的新副本,并记得告诉logstash从该文件中读取。 另一种方法是你可以删除sincedb文件,无论它位于何处。您可以告诉logstash使用sincedb_path功能编写sincedeb文件的位置。

我希望这一切都有所帮助!