elasticsearch 某些KV过滤器值具有自定义日期,在Kibana中标识为字符串,elasticsearch,logstash,elasticsearch,Logstash" /> elasticsearch 某些KV过滤器值具有自定义日期,在Kibana中标识为字符串,elasticsearch,logstash,elasticsearch,Logstash" />

elasticsearch 某些KV过滤器值具有自定义日期,在Kibana中标识为字符串

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

我在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-MM-DD-HHMMSS
。当Logstash将字段发送到ES时,Kibana将它们显示为字符串。我怎样才能让Logstash知道这些字段是日期字段,并以此在ES中将它们作为日期而不是字符串进行索引

我不想编辑索引的映射,因为它需要重新索引。我对这些字段的最终目标是计算字段之间的差异(以秒、分钟、小时为单位),并在Kibana中显示

我的想法是:

  • 如果值的格式为YYYY-MM-DD-HHMMSS,则迭代k,v筛选结果(使用正则表达式检查)
  • 在这种情况下,将字段的值设置为从历元开始的毫秒
  • 我决定使用k、v过滤器和Ruby代码作为解决方案,但我面临一个问题。

    我的解决方案:

  • 我使用kv过滤器将每条线路转换为键值集
  • 我将kv过滤器resut保存到一个专用字段中
  • 在这个专用字段上,我运行了一个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:语法错误,意外的空哈希
    ,这实际上并不意味着您得到了空值,它似乎与双引号的转义符有关。只要试着用一个引号替换双引号。

    在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自动检测拼写错误并用红色下划线标记,对吗?还是你在说别的什么?是的,我指的是你浏览器中的拼写检查器。我们的目标是为许多未来读者提供有用的问答,如果通过英语检查器进行检查,它将更具可读性。一般来说,是的,使用红色下划线。请检查您的浏览器是否已设置为执行此操作。