logstash grok TIMESTAMP_ISO8601类型?

cla*_*lay 2 logstash logstash-grok

我有一个简单的logstash grok过滤器:

filter {
  grok {
    match => { "message" => "^%{TIMESTAMP_ISO8601:timestamp} %{NOTSPACE:name} %{WORD:level} %{SPACE} %{GREEDYDATA:message}$" }
    overwrite => [ "message" ]
  }
}
Run Code Online (Sandbox Code Playgroud)

这可行,它解析我的日志,但根据Kibana,时间戳值以数据类型输出string.

logstash @timestamp字段具有数据类型date.

grok文档说您可以指定数据类型转换,但只支持int和float:

如果您希望转换语义的数据类型,例如将字符串更改为整数,则使用目标数据类型将其后缀.例如%{NUMBER:num:int},它将num语义从字符串转换为整数.目前唯一支持的转换是int和float.

这表明我应该把它留作字符串,但是,如果索引支持datetime值,为什么你不希望它正确存储并可以作为日期时间进行排序?

sys*_*138 6

你可以,但是你需要另一个过滤器来将它转换为日期.

filter {
  date {
    match => [ "timestamp", ISO8601 ]
  }
}
Run Code Online (Sandbox Code Playgroud)

通常的用法是以@timestamp这种方式设置字段.但是如果你想把它带到另一个领域而不@timestamp管它:

filter {
  date {
    match  => [ "timestamp", ISO8601 ]
    target => "target_timestamp"
  }
}
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个名称target_timestamp将具有您正在寻找的ElasticSearch数据类型的字段.