0

我正在尝试使用 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"
        }
  }

}

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

4

1 回答 1

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 来获取从头到尾读取的文件,而不是从头到尾读取(因此流读取器认为它更像是一个完整的实体而不是活动流)。

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

这就是我发现对我有用的东西,试试吧,如果它有效,请在这里告诉我们(希望它有效)。

于 2015-09-30T21:28:41.747 回答