Logstash - 使用mutate with split

时间:2014-10-30 18:24:25

标签: filter split logstash

我尝试将 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]" ]
                }
        }
}

1 个答案:

答案 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", "\..*", "" ]

这将删除"。"。

之后的所有内容

希望有所帮助。