使用 Logstash Ruby 过滤器解析 csv 文件

Using Logstash Ruby filter to parse csv file

我有一个 elasticsearch 索引,我用它来索引一组文档。

这些文件最初是 csv 格式,我正在寻找使用 logstash 解析这些文件。

我的问题是我有以下问题。

field1,field2,field3,xyz,abc

field3 类似于 123456789,我想使用 ruby 代码过滤器将其解析为 4.56(789)。

我的尝试:

我尝试使用标准输入和标准输出 logstash.conf .

input {
        stdin {
        }
}

filter {
        ruby {
                code => "
                  b = event["message"]
                  string2=""
                  for counter in (3..(num.size-1))
                         if counter == 4
                                string2+= '_'+ num[counter]
                         elsif counter ==  6
                                string2+= '('+num[counter]
                         elsif counter == 8
                                string2+= num[counter]  +')'
                         else
                                string2+= num[counter]
                         end

                  end

                 event["randomcheck"] = string2

                "
        }
}


output {
        stdout {
                codec=>rubydebug
        }
}

我在使用它时遇到语法错误。

我的最终目标是将其与我的 csv 文件一起使用,但首先我尝试将其与 stdin 和 stdout 一起使用。

任何帮助将不胜感激。

您收到语法错误的原因很可能是因为双引号字符串中有未转义的双引号。要么将字符串用单引号引起来,要么将其保持双引号但在内部使用单引号。我也不明白该代码应该如何工作。

但除此之外,为什么首先要使用 ruby 过滤器?您可以使用 csv 过滤器进行 CSV 解析,并使用几个标准过滤器将 123456789 转换为 4.56(789)。

filter {
  # Parse the CSV fields and then delete the 'message' field.
  csv {
    remove_field => ["message"]
  }
  # Given an input such as 123456789, extract 4, 56, and 789 into
  # their own fields.
  grok {
    match => [
      "column3",
      "\d{3}(?<intpart>\d)(?<fractionpart>\d{2})(?<parenpart>\d{3})"
    ]
  }
  # Put the extracted fields together into a single field again,
  # then delete the temporary fields.
  mutate {
    replace => ["column3", "%{intpart}.%{fractionpart}(%{parenpart})"]
    remove_field => ["intpart", "factionpart", "parenpart"]
  }
}

上面示例中的临时字段的名称非常糟糕,因为我不知道它们代表什么。此外,根据输入的内容,您可能需要调整 grok 表达式。就目前而言,它假定输入九位数字。