在发送到elasticsearch之前为字段添加额外的值

时间:2018-01-24 21:51:21

标签: elasticsearch logstash logstash-grok filebeat

我使用logstash,filebeat和grok将日志中的数据发送到我的弹性支持实例。这是管道中的grok配置

filter {
    grok {
        match => {
            "message" => "%{SYSLOGTIMESTAMP:messageDate} %{GREEDYDATA:messagge}"
        }
    }
}

这样可以正常使用,问题是messageDate采用此格式Jan 15 11:18:25并且没有年份条目。
现在,我实际上知道这些文件创建的年份,我想知道是否可以在此过程中将值添加到字段中,也就是说,在发送到Jan 15 11:18:25之前,以某种方式将其转换为2016 Jan 15 11:18:25 elasticsearch(显然没有编辑文件,我可以做到,甚至可以轻松实现,但它只是对我必须做的事情的暂时解决,而不是一个明确的解决方案)

如果有可能但我没试过谷歌搜索...

3 个答案:

答案 0 :(得分:1)

Valepu,

修改字段中数据的唯一方法是使用ruby过滤器:

filter {
  ruby {

    code => "#your code here#"
  }
}

有关...如何获取的更多信息,请设置字段值,这里是链接:

https://www.elastic.co/guide/en/logstash/current/plugins-filters-ruby.html

答案 1 :(得分:1)

如果您有一个单独的日期字段作为字符串,您可以使用logstash date plugin:

  

https://www.elastic.co/guide/en/logstash/current/plugins-filters-date.html

如果您没有将它作为单独的字段(如本例所示),请使用此站点构建您自己的grok模式:

  

http://grokconstructor.appspot.com/do/match

我这是为了预处理值:

%{YEAR:yearVal} %{MONTH:monthVal} %{NUMBER:dayVal} %{TIME:timeVal} %{GREEDYDATA:message}

我猜不是最优雅的,但你会得到不同领域的价值观。使用此功能,您可以创建自己的日期字段并使用日期过滤器对其进行解析,以便获得可比较的值,或者您可以单独使用这些字段。我确信有一个更好的解决方案,例如你可以制作自己的grok模式并使用它,但我也会为你留下一些探索。 :)

答案 2 :(得分:0)

通过仔细阅读grok文档,我发现了谷歌找不到的东西以及我第一次读到那个页面时显然错过了

https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html#plugins-filters-grok-add_field

使用add_fieldremove_field选项,我设法将年份添加到我的日期,然后我使用日期插件将其作为时间戳发送到logstash。我的过滤器配置现在看起来像这样

filter {
    grok {
        match => {
            "message" => "%{SYSLOGTIMESTAMP:tMessageDate} %{GREEDYDATA:messagge}"
            add_field => { "messageDate" => "2016 %{tMessageDate}" }
            remove_field => ["tMessageDate"]
        }
    }
    date {
        match => [ "messageDate", "YYYY MMM dd HH:mm:ss"]
    }
}

它运作良好