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

Add extra value to field before sending to elasticsearch

我正在使用 logstash、filebeat 和 grok 将数据从日志发送到我的 elastisearch 实例。这是管道中的 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(显然没有编辑文件,我可以轻松地做到这一点,但它只是对我必须做的事情的临时修复,而不是最终的解决方案)

如果可能的话,我尝试过谷歌搜索,但没有成功...

瓦勒普,

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

filter {
  ruby {

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

有关...如何获取、设置字段值等更多信息,请点击此处 link:

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

如果你有一个单独的字符串日期字段,你可以使用 logstash 日期插件:

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 模式并使用它,但我也会为您留下一些探索。 :)

通过通读 grok 文档,我发现了 google 对我来说找不到的东西,而且我第一次阅读该页面时显然错过了

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"]
    }
}

而且效果很好