Kibana没有使用@timestamp字段获取记录

时间:2017-02-14 21:28:09

标签: logstash kibana elastic-stack

我有以下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}
}

2 个答案:

答案 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 加上您创建的新时间戳字段,这样您就可以自由地为事件编制索引希望根据您需要的时间戳。