匹配整个文件

时间:2015-08-07 10:19:12

标签: logstash logstash-grok logstash-configuration

我正在尝试使用logstash将整个文本文件作为消息提供给ElasticSearch。我正在尝试使用多行编解码器,但我无法弄清楚我必须使用哪种模式。 ((。| \ n)*)此正则表达式匹配所有文本,但这不适用于logstash。

input {
  file {
      path => "/opt/rp/*.txt"
      type => "rp"
      start_position => "beginning"
      stat_interval => 1
      codec => multiline {
          pattern => "((.|\n)*)"
          negate => "false"
          what => "next"
        }
  }

}

我应该使用什么模式来匹配文本文件的所有内容?

1 个答案:

答案 0 :(得分:1)

所以对我来说,解决这个问题的关键是调整输入和过滤器。

这会进入您的输入{}:

file {
   path => [ "/opt/rp/*.txt" ]
   start_position => "beginning"
   type => "rp"
}

这会进入你的过滤器{}:

if [type] == "rp" {
    multiline {
      pattern => "/.*./gm"
      negate => true
      what => "previous"
      add_field => [ "executed_at", "%{@timestamp}" ]
  }
}

所以你的conf。文件需要有这些段才能使它工作。

解释(afaik):

您可以使用输入中的start_position来从开头到结尾读取文件,而不是从头开始读取文件(以便流阅读器将其视为完整实体而非活动流)。

然后,你使用多线过滤器(不是编解码器,我试过 - 不适用于此),因为它是为此目的。模式是关键,即RegEx基本上匹配文件中的所有内容。否定被设置为true,所以即使它没有,否定否则会将其视为一个完整的文件。您使用previous,以便将内容添加到上一个条目而不是下一个条目。 add_field是可选的,但我发现它很有用,所以即使日志上没有定时名称/正确的时间戳,我也可以建立时间。

这是我发现为我工作的东西,尝试一下,如果它有效,请告诉我们(希望它确实如此)。