我尝试将 mutate 过滤器与 split 方法一起使用,以提取由json过滤器检索的字段的一部分。但我没有找到如何利用分裂的结果。 这是我的逻辑配置(只有简单的json部分才能正常工作):
filter {
if [type] == "phperrors" {
json {
source => "message"
target => "phperror_log"
remove_field => "message"
add_tag => [ "php", "error" ]
}
mutate {
split => ["[phperror_log][server]", "."]
#if [phperror_log][server][1] {
add_field => [ "pop", "%{[phperror_log][server][1]}" ]
#}
}
}
}
正如我所说,json部分运行良好,并且phperror_log.server字段存在(并且值类似于node01.ny或node01.par或node02)。
但我想要的是创建一个新字段,如果分割创建一个包含2个字段的数组,我想我没有用[phperror_log] [server] [1]做正确的事情。
您有解决此类用例的线索,建议或最佳做法吗?
提前致谢
编辑:我使用可以使用拆分的conf进行编辑...但是if不正常
根据Alain的提示和建议,最后编辑一个很好的conf:
filter {
if [type] == "phperrors" {
json {
source => "message"
target => "phperror_log"
remove_field => "message"
add_tag => [ "php", "error" ]
}
if [phperror_log][server] =~ /\./ {
mutate {
split => ["[phperror_log][server]", "."]
add_field => [ "pop", "%{[phperror_log][server][1]}" ]
add_field => [ "errorhost", "%{[phperror_log][server][0]}" ]
}
} else {
mutate {
add_field => [ "pop", "not defined" ]
add_field => [ "errorhost", "%{[phperror_log][server]}" ]
}
}
mutate {
remove_field => [ "[phperror_log][server]" ]
}
}
}
答案 0 :(得分:2)
分割" node01.ny"后,您的字段将是[" node01"," ny" ]。您的示例并未真正显示您要对这些拆分值执行的操作,但基本的操作是查看数组中是否包含值:
if "ny" IN [phperror.server] {
}
请注意,只有过滤器成功,才会运行add_field。因此,在添加字段之前,您不需要检查数组。
也就是说,只有当字段包含"。"时,分割才会起作用。你可以这样做:
if phperror.server =~ /\./ {
mutate {
add_field => [ "hey", "i saw a period" ]
}
}
您的示例可能会显示您要删除原始字段的部分值。试试gsub:
gsub => [ "phperror.server", "\..*", "" ]
这将删除"。"。
之后的所有内容希望有所帮助。