我正在尝试确定logstash集群中最近记录的新鲜度,但是我在消化Elasticsearch DSL时遇到了一点麻烦。
现在我正在做这样的事情来提取时间戳:curl -sX GET 'http://localhost:9200/logstash-2015.06.02/' -d'{"query": {"match_all": {}}}' | json_pp | grep时间戳
让我;"@timestamp":"2015 - 06 - 02年t00:00:28.371 + 00:00",
我想直接使用elasticsearch查询,而不需要使用grep。
原始JSON(根据长度剪短)如下所示:
{
"took" : 115,
"timed_out" : false,
"hits" : {
"hits" : [
{
"_index" : "logstash-2015.06.02",
"_source" : {
"type" : "syslog",
"@timestamp" : "2015-06-02T00:00:28.371+00:00",
"tags" : [
"sys",
"inf"
],
"message" : " 2015/06/02 00:00:28 [INFO] serf: EventMemberJoin: generichost.example.com 10.1.1.10",
"file" : "/var/log/consul.log",
"@version" : 1,
"host" : "generichost.example.com"
},
"_id" : "AU4xcf51cXOri9NL1hro",
"_score" : 1,
"_type" : "syslog"
},
],
"total" : 8605141,
"max_score" : 1
},
"_shards" : {
"total" : 50,
"successful" : 50,
"failed" : 0
}
}
任何帮助都会很感激。我知道这个问题很简单,我只是不知道它是什么。
您不需要为此使用DSL。您可以简单地将所有内容塞进URL查询字符串,如下所示:
curl -s XGET 'localhost:9200/logstash-2015.06.02/_search?_source=@timestamp&size=1&sort=@timestamp:desc&format=yaml'
:
-
_source=@timestamp
表示我们只对@timestamp
值感兴趣 -
size=1
意味着我们只需要一个结果 -
sort=@timestamp:desc
表示我们希望按@timestamp
降序排序(即最新的优先) -
format=yaml
将得到你的结果在YAML格式,这是更简洁的JSON在你的情况下
输出如下所示:
- _index: "logstash-2015.06.02"
_type: "syslog"
_id: "AU4xcf51cXOri9NL1hro"
_score: 1.0
_source:
@timestamp: "2015-06-02T00:00:28.371+00:00"
你不再需要json_pp
了,你仍然可以简单地grep @timestamp
来获得你需要的数据。
请注意,在1.6.0中,将有一种方法可以过滤掉所有的元数据(即_index
, _type
, _id
, _score
),并且只使用URL中的filter_path
参数获得_source
的搜索结果。