elasticsearch logstash kv过滤器,使用动态映射将字符串转换为整数,elasticsearch,logstash,elasticsearch,Logstash" /> elasticsearch logstash kv过滤器,使用动态映射将字符串转换为整数,elasticsearch,logstash,elasticsearch,Logstash" />

elasticsearch logstash kv过滤器,使用动态映射将字符串转换为整数

elasticsearch logstash kv过滤器,使用动态映射将字符串转换为整数,elasticsearch,logstash,elasticsearch,Logstash,我有一个类似以下格式的日志: name=johnny amount=30 uuid=2039248934 问题是我在多个日志文件上使用这个解析器,每个日志文件基本上都包含许多kv对 有没有一种方法可以识别值是整数,并将其转换为整数,而不必对每个键值对使用mutate?(而不是字符串) 我找到了这个链接,但在模板json文件应该放在哪里以及如何使用它方面非常模糊。 您可以使用ruby插件来完成 input { stdin {} } filter { ruby {

我有一个类似以下格式的日志:

name=johnny amount=30 uuid=2039248934
问题是我在多个日志文件上使用这个解析器,每个日志文件基本上都包含许多kv对

有没有一种方法可以识别值是整数,并将其转换为整数,而不必对每个键值对使用mutate?(而不是字符串)

我找到了这个链接,但在模板json文件应该放在哪里以及如何使用它方面非常模糊。

您可以使用ruby插件来完成

input {
    stdin {}
}

filter {
    ruby {
        code => "
            fieldArray = event['message'].split(' ');
            for field in fieldArray
                name = field.split('=')[0];
                value = field.split('=')[1];
                if value =~ /\A\d+\Z/
                    event[name] = value.to_i
                else
                    event[name] = value
                end
            end
        "
    }
}
output {
    stdout { codec => rubydebug }
}
首先,按空格将消息拆分为一个数组。 然后,对于每个k,v映射,检查值是否为数字,如果是,则将其转换为整数

以下是您输入的示例输出:

{
       "message" => "name=johnny amount=30 uuid=2039248934",
      "@version" => "1",
    "@timestamp" => "2015-06-25T08:24:39.755Z",
          "host" => "BEN_LIM",
          "name" => "johnny",
        "amount" => 30,
          "uuid" => 2039248934
}
Logstash 5的更新解决方案:

input {
    stdin {}
}

filter {
    ruby {
        code => "
            fieldArray = event['message'].split(' ');
            for field in fieldArray
                name = field.split('=')[0];
                value = field.split('=')[1];
                if value =~ /\A\d+\Z/
                    event.set(name, value.to_i)
                else
                    event.set(name, value)
                end
            end
        "
    }
}
output {
    stdout { codec => rubydebug }
}

注意,如果您决定升级到Logstash 5,则会有一些突破性的更改:

特别是,需要修改该事件以使用event.get或event.set。下面是我用来让它工作的方法(基于Ben Lim的例子):


非常感谢。这很有帮助。@Ben刚刚发现了这个。与使用kv插件相比,您认为这种方法的效率如何?
input {
    stdin {}
}

filter {
    ruby {
        code => "
            fieldArray = event.get('message').split(' ');
            for field in fieldArray
                name = field.split('=')[0];
                value = field.split('=')[1];
                if value =~ /\A\d+\Z/
                    event.set(name, value.to_i)
                else
                    event.set(name, value)
                end
            end
        "
    }
}
output {
    stdout { codec => rubydebug }
}