Logstash 的 prune 滤器插件可以利用白名单,以确保仅从 Logstash 输出特定的所需字段,并删除所有其他字段。 在此博客文章中,我们演示了在索引到 Elasticsearch 之前,如何使用 Logstash 将所需字段和所需子文档列入白名单。
例子输入文档
作为 Logstash 的输入,我们使用包含股市交易的 CSV 文件。 以下是 CSV 股票市场交易的一些示例。
1483230600,1628.75,1678.1,1772.8,2443.6
1483232400,1613.63,1688.5,1750.5,2460.2
1483234200,1606.51,1678.6,1718,2448.2
1483236000,1621.04,1684.1,1708.1,2470.4
逗号分隔的值表示 “time”,“ DAX”,“ SMI”,“ CAC”,“ FTSE”。 你可能希望将以上几行复制并粘贴到一个名为 stocks.csv 的 CSV 文件中,以便执行此博客文章后面给出的示例命令行。
样本 Logstash 管道
下面是一个 Logstash 管道,可以将其存储在名为 “stocks.conf” 的文件中,该文件将执行以下操作:
- 从标准输入中以 CSV 格式的输入读取股市交易。
- 将 CSV 输入的每一行映射到 JSON 文档,其中 CSV 列映射到 JSON 字段。
- 将时间字段转换为 Unix 格式。
- 将 DAX 和 CAC 字段移到称为 “my_nest” 的嵌套结构中。
- 将 “my_nest” 字段(包含子文档)和 “SMI” 字段列入白名单,以便将所有其他(未列入白名单的)字段删除。
- 将生成的文档写入名为 “stocks_whitelist_test” 的Elasticsearch 索引。
stocks.conf
# For this simple example, pipe in data from stdin.
input {
stdin {}
}
filter {
csv {
columns => ["time","DAX","SMI","CAC","FTSE"]
separator => ","
convert => { 'DAX' => 'float'
'SMI' => 'float'
'CAC' => 'float'
'FTSE' => 'float'}
}
date {
match => ['time', 'UNIX']
}
mutate {
# Move DAX and CAC into a sub-document
# called 'my_nest'
rename => {
"DAX" => "[my_nest][DAX]"
"CAC" => "[my_nest][CAC]"
}
}
# Remove everything except "SMI" and the
# "my_nest" sub-document
prune {
whitelist_names => [ "SMI", "my_nest" ]
}
}
output {
stdout { codec => dots }
elasticsearch {
index => "stocks_whitelist_test"
}
}
测试 Logstash 管道
要使用示例 CSV 数据测试该管道,你可以执行与以下命令类似的操作,并对其进行修改以确保您使用的系统路径正确:
cat ./stocks.csv | ./bin/logstash -f ./stocks.conf
你可以通过从 Kibana 的开发人员控制台执行以下命令来检查已存储在 Elasticsearch 中的数据:
GET /stocks_whitelist_test/_search
其中应显示具有以下结构的文档:
"hits" : [
{
"_index" : "stocks_whitelist_test",
"_type" : "_doc",
"_id" : "Pk4R0nMBSNqQApgz9SS0",
"_score" : 1.0,
"_source" : {
"SMI" : 1688.5,
"my_nest" : {
"DAX" : 1613.63,
"CAC" : 1750.5
}
}
},
{
"_index" : "stocks_whitelist_test",
"_type" : "_doc",
"_id" : "PE4R0nMBSNqQApgz9CTu",
"_score" : 1.0,
"_source" : {
"SMI" : 1684.1,
"my_nest" : {
"DAX" : 1621.04,
"CAC" : 1708.1
}
}
},
...
请注意,只有 “my_nest” 和 “SMI” 已被索引,如文档 “ _source” 的内容所示。 另请注意,“FTSE” 和 “time” 字段已删除,因为它们不在 prune 过滤器的白名单中。
结论
在此博客文章中,我们演示了 Logstash 的 prune 过滤器插件如何利用白名单来确保 Logstash 仅输出特定的所需字段。