Logstash - 来自 CSV 列的子字符串

Logstash - Substring from CSV column

我想将 CSV 文件中的许多信息导入 Elastic Search。 我的问题是我不知道如何使用等效的子字符串将 select 信息放入 CSV 列中。

在我的例子中,我有一个字段日期 (YYYYMMDD),我想要 (YYYY-MM-DD)。

我像这样使用过滤器、变异、gsub:

filter 
{
  mutate 
  {
    gsub => ["date", "[0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]", "[0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789]"]
  }
}

但我的结果是错误的。 我可以识别我的字符串,但我不知道如何提取其中的一部分。

我的目标是拥有类似的东西:

gsub => ["date", "[0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]","%{date}(0..3}-%{date}(4..5)-%{date}"(6..7)]

%{date}(0..3} : select 从 csv 列的第一个到 4 个字符 date

您可以使用ruby插件进行转换。如您所说,您将有一个 date 字段。所以,我们可以直接在ruby

中使用
filter {
    ruby {
        code => "
                date = Time.strptime(event['date'],'%Y%m%d')
                event['date_new'] = date.strftime('%Y-%m-%d')
        "
    }
}

date_new字段是你想要的格式。

首先,您可以使用正则表达式范围来匹配序列,因此您可以使用 [0-9] 而不是 [0123456789]。如果你知道会有 4 个数字,你可以做 [0-9]{4}.

其次,您想要 "capture" 部分输入字符串并在输出中重新排序。为此,您需要捕获组:

([0-9]{4})([0-9]{2})([0-9]{2})

其中括号定义组。然后你可以参考你的gsub右边的那些:

--

\1为第一个捕获组等

你也可以考虑在做 grok{} 的时候得到这三个字段,然后再把它们放在一起(也许用 add_field)。