我正在使用logstash中的kv filter以以下格式处理配置文件:
key1=val1
key2=val2
key3=2020-12-22-2150
日志中有以下行:
kv {
field_split => "\r\n"
value_split => "="
source => "message"
}
conf文件中的某些字段具有以下日期格式: YYYY-MM-DD-HHMMSS
. 当logstash将字段发送到es时,kibana将它们显示为字符串。我怎样才能让logstash知道这些字段是日期字段,并以此在es中将它们作为日期而不是字符串进行索引?
我不想编辑索引的Map,因为它需要重新索引。我对这些字段的最终目标是计算字段之间的差异(以秒、分、小时为单位),并用kibana显示。
我的想法是:
如果值的格式为yyyy-mm-dd-hhmmss,则迭代k,v筛选器结果(使用regex检查)
在这种情况下,将字段的值设置为自epoch以来的毫秒
我决定使用k、v过滤器和ruby代码作为解决方案,但我面临一个问题:
2条答案
按热度按时间ozxc1zmp1#
我的解决方案:
我使用千伏滤波器将每一行转换成键值集。
我把千伏滤波器的结果保存到一个专门的领域。
在这个专用字段上,我运行了一个ruby脚本,它将自epoch以来所有具有自定义格式的日期更改为毫秒。
代码:
顺便说一下,如果在ruby编译中遇到以下错误:
(ruby filter code):6: syntax error, unexpected null hash
这实际上并不意味着你得到了一个空值,它似乎与双引号的转义字符有关。试着用一个引号代替双引号。6xfqseft2#
在logstash之外,通过在索引上添加一个动态的模板并让他管理字段类型,可以更容易地完成这项工作。如果字段名足够清晰(*\u date)或定义正则表达式,则可以将其用作检测器
上面的代码尚未测试。
你可以在这里找到官方文件。https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-templates.html