elasticsearch—某些kv过滤器值具有在kibana中标识为字符串的自定义日期

cyvaqqii  于 2021-06-13  发布在  ElasticSearch
关注(0)|答案(2)|浏览(458)

我正在使用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代码作为解决方案,但我面临一个问题:

ozxc1zmp

ozxc1zmp1#

我的解决方案:
我使用千伏滤波器将每一行转换成键值集。
我把千伏滤波器的结果保存到一个专门的领域。
在这个专用字段上,我运行了一个ruby脚本,它将自epoch以来所有具有自定义格式的日期更改为毫秒。
代码:

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: syntax error, unexpected null hash 这实际上并不意味着你得到了一个空值,它似乎与双引号的转义字符有关。试着用一个引号代替双引号。

6xfqseft

6xfqseft2#

在logstash之外,通过在索引上添加一个动态的模板并让他管理字段类型,可以更容易地完成这项工作。如果字段名足够清晰(*\u date)或定义正则表达式,则可以将其用作检测器

"match_pattern": "regex",
"match": "^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$"

上面的代码尚未测试。
你可以在这里找到官方文件。https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-templates.html

相关问题