elasticsearch 某些KV过滤器值具有自定义日期,在Kibana中标识为字符串
我在Logstash中使用kv filter以以下格式处理配置文件:elasticsearch 某些KV过滤器值具有自定义日期,在Kibana中标识为字符串,elasticsearch,logstash,elasticsearch,Logstash,我在Logstash中使用kv filter以以下格式处理配置文件: key1=val1 key2=val2 key3=2020-12-22-2150 在Logstash中包含以下行: kv { field_split => "\r\n" value_split => "=" source => "message" } conf文件中的某些my字段的日期格式如下:YYYY
key1=val1
key2=val2
key3=2020-12-22-2150
在Logstash中包含以下行:
kv {
field_split => "\r\n"
value_split => "="
source => "message"
}
conf文件中的某些my字段的日期格式如下:YYYY-MM-DD-HHMMSS
。当Logstash将字段发送到ES时,Kibana将它们显示为字符串。我怎样才能让Logstash知道这些字段是日期字段,并以此在ES中将它们作为日期而不是字符串进行索引
我不想编辑索引的映射,因为它需要重新索引。我对这些字段的最终目标是计算字段之间的差异(以秒、分钟、小时为单位),并在Kibana中显示
我的想法是:
filter {
if "kv_file" in [tags] {
kv {
field_split => "\r\n"
value_split => "="
source => "message"
target => "config_file"
}
ruby {
id => "kv_ruby"
code => "
require 'date'
re = /([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])-[0-23]{2}[0-5]{1}[0-9]{1}[0-5]{1}[0-9]{1})/
hash = event.get('config_file').to_hash
hash.each { |key,value|
if value =~ re
date_epochs_milliseconds = DateTime.strptime(value,'%F-%H%M%S').strftime('%Q')
event.set(key, date_epochs_milliseconds.to_i)
end
}
"
}
}
}
顺便说一句,如果您在Ruby编译中遇到以下错误:
(Ruby filter code):6:语法错误,意外的空哈希
,这实际上并不意味着您得到了空值,它似乎与双引号的转义符有关。只要试着用一个引号替换双引号。在logstash之外,通过在索引上添加一个动态模板并让他管理字段类型,可以更轻松地完成这项工作。
如果字段名足够清晰(*\u date),您可以将其用作检测器,或者定义一个正则表达式
"match_pattern": "regex",
"match": "^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$"
上面的代码还没有经过测试
你可以在这里找到官方文件。
(关于使用拼写检查器的快速提醒)。@halfer its自动检测拼写错误并用红色下划线标记,对吗?还是你在说别的什么?是的,我指的是你浏览器中的拼写检查器。我们的目标是为许多未来读者提供有用的问答,如果通过英语检查器进行检查,它将更具可读性。一般来说,是的,使用红色下划线。请检查您的浏览器是否已设置为执行此操作。