logstash 文件输出不适用于元数据字段

logstash file output not working with metadata fileds

我有以下管道,要求是,我需要将“指标”数据写入一个文件,将事件数据写入另一个文件。这个管道有两个问题。

  1. 文件输出不是每 30 秒创建一个“带时间戳的文件”,而是创建一个具有此名称的文件 output%{[@metadata][ts]}.csv 并继续附加数据。

  2. CSV 输出,每 30 秒创建一个带有时间戳的新文件,但不知何故它会创建一个名为 output%{[@metadata][ts]} 的额外文件并继续将元信息附加到该文件.

有人可以指导我如何解决这个问题吗?

input {
  beats {
    port => 5045
  }
}

filter {
   ruby {
        code => '
                event.set("[@metadata][ts]",  Time.now.to_i / 30)
                event.set("[@metadata][suffix]", "output" + (Time.now.to_i / 30).to_s + ".csv")
        '
    }
}

filter {
  metrics {
    meter => [ "code" ]
    add_tag => "metric"
    clear_interval => 30
    flush_interval => 30
  }
}


output {

    if "metric" in [tags] {
        file {
            flush_interval => 30
            codec => line { format => "%{[code][count]} %{[code][count]}"}
            path => "C:/lgstshop/local/csv/output%{[@metadata][ts]}.csv"
        }
        stdout {
          codec => line {
            format => "rate: %{[code][count]}"
          }
        }
      }

   file {
      path => "output.log"
   }    
   csv {
       fields => [ "created", "level", "code"]
       path => "C:/lgstshop/local/output%{[@metadata][ts]}.evt"
    }
}

指标过滤器在管道中生成新事件。这些事件只会通过其后的过滤器。因此,度量事件没有 [@metadata][ts] 字段,因此不会替换输出部分中的 sprintf 引用。移动 ruby 过滤器,使其位于指标过滤器之后。

如果您不希望将指标发送到 csv,则用 if "metric" not in [tags] { 包装该输出或将其放在现有条件的 else 中。