【问题标题】:Logstash - using mutate with splitLogstash - 使用 mutate 和 split
【发布时间】:2014-10-30 18:24:24
【问题描述】:

我正在尝试将 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 的提示和建议进行最后一次编辑:

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]" ]
                }
        }
}

【问题讨论】:

    标签: filter split logstash


    【解决方案1】:

    拆分“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", "\..*", "" ]
    

    这将删除“。”之后的所有内容。

    希望对您有所帮助。

    【讨论】:

    • 非常感谢,您的解释很清楚。我会尽快尝试的
    • 很好,我将在第一篇文章中发布我的最后一个配置文件,它运行良好,谢谢 Alain 的提示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多