LogStash - 解析 http 过滤结果

LogStash - Parse http filter result

一如既往,官方文档缺少示例。

我有一个调用 API 的过滤器并且必须添加解析 API 结果的字段:

http {
            url => "rest/api/subnet/check_subnet_from_ip/"
            query =>  { "ip" => "%{[source][ip]}" }
            verb => GET
      }

API 响应是这样的:

{ "name": "SUBNET1", "cidr": "192.168.0.0/24" }

我需要使用这些结果添加新字段。 我需要考虑一个空结果 {}

我找不到任何有关解析结果的示例。

谢谢。

您的回复是一个 json 文档,您需要使用 json 过滤器来解析它,请查看 json filter 的文档以了解所有可用选项。

但基本上你需要这样的东西:

http {
    url => "rest/api/subnet/check_subnet_from_ip/"
    query =>  { "ip" => "%{[source][ip]}" }
    verb => GET
    target_body => api_response
}
json {
    source => "api_response"
}

要添加需要使用 mutate 过滤器的新字段,请查看 mutate filter 的文档以了解所有可用选项。

要添加新字段,您需要这样的东西:

mutate {
    add_field => { "newFieldName" => "newFieldValue" }
}

或者使用现有字段的值添加新字段:

mutate {
    add_field => { "newFieldName" => "%{existingField}" }
}

考虑以下格式的答案:

{ "name": "SUBNET1", "cidr": "192.168.0.0/24" }

事实上,您需要检查空响应,您还需要添加条件,因此您的管道应该类似于此示例:

http {
    url => "rest/api/subnet/check_subnet_from_ip/"
    query =>  { "ip" => "%{[source][ip]}" }
    verb => GET
    target_body => api_response
}
json {
    source => "api_response"
}

if [api_response][name]
{
    mutate 
    {
        add_field => { "[source][subnet][name]" => "%{[api_response][name]}" }
    }
}

if [api_response][cidr]
{
    mutate 
    {
        add_field => { "[source][subnet][cidr]" => "%{[api_response][cidr]}" }
    }
}

这将检查字段 namecidr 是否存在,如果存在,它将添加新字段。

如果需要,您也可以重命名字段,只需使用此 mutate 配置即可。

mutate {
    rename => { "name" => "subnet_name" }
}