我有以下JSON日志,我将其添加到logstash并输出到ElasticSearch中。当" @ timestamp"在日志中,记录不会出现在Kibana中。但是,当我将日志中的JSON字段重命名为" timestamp" (删除@)它的工作原理。如何解决这个问题,以便正确选择带有@timestamp字段的条目?感谢。
JSON日志:
{
"@timestamp": "2017-02-14T15:55:05.070Z",
"@version": "1",
"action": "create",
"controller": "MyController",
"db": 10.51,
"duration": 40.77,
"format": "json",
"message": "[200] POST /api/mycontroller (MYCONTROLLER#create)",
"method": "POST",
"path": "/api/mycontroller",
"remote_ip": "55.11.99.000",
"status": 200,
"user_id": 8888,
"view": 12.91
}
logstash.conf
input {
tcp {
port => 5000
}
}
filter {
json {
source => "message"
}
}
output {
elasticsearch {
hosts => "elasticsearch:9200"
}
stdout {codec => rubydebug}
}
答案 0 :(得分:0)
通常如何完成此操作是将来自源的时间戳放入不是@timestamp
然后add a date { }
filter的字段中,以将该字段转换为@timestamp
值
filter {
date {
match => [ "timestamp", ISO8601 ]
}
mutate {
remove_field => [ "timestamp" ]
}
}
在后处理中执行此操作似乎很奇怪,但Logstash喜欢这样。 mutate {}
删除了额外的时间戳字段,因此它不会显示在您的ES文档中。
答案 1 :(得分:0)
这是因为Kibana
默认为自己创建一个 @timestamp 字段来索引事件。因此,由于您的字段名称相同,Kibana
会尝试使用浏览器的时间覆盖它。
所以你可以做的是@ sysadmin1138建议, mutate @timestamp 字段,将值替换为新字段并删除现有的 @时间戳,这样你就不会被覆盖。
如果您希望仍然拥有 @timestamp 字段,只要您已将其替换为新字段即可。在这种情况下,您可能有两个时间戳,一个是默认的Kibana
的 @timestamp 加上您创建的新时间戳字段,这样您就可以自由地为事件编制索引希望根据您需要的时间戳。