我可以使用gsub以递归方式将所有字段名称替换为另一个字段吗?

时间:2014-11-12 02:17:18

标签: logstash

在ElasticSearch中更改我的映射以更明确地输入我输入系统的数据之后,我无意中将我的新变量设置为嵌套对象。在考虑更多之后,我实际上喜欢这些字段是嵌套对象的想法,因为这样我可以明确地知道src_port统计信息是来自netflow还是来自ASA日志,作为示例。

我想使用mutate(也许是gsub?)来将给定类型的所有字段名重命名为newtype.fieldname。我看到有gsub使用正则表达式,并且重命名采用文字字段名称,但是当我将替换该类型中的所有字段时,我想防止有30个不同的gsub / rename语句" newtype"前缀。

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:3)

以下是供您参考的示例。

input {
    stdin{
            type => 'netflow'
    }
}

filter {
    mutate {
            add_field => {"%{type}.message" => "%{message}"}
            remove_field => ["message"]
    }
}

output {
    stdout{
            codec => rubydebug
    }
}

在此示例中,我将message字段名称更改为type.message,然后删除了原始message字段。我想你可以用这个样本做你想做的事。

希望这可以帮到你。

我已更新我的回答了!

使用ruby插件做你想做的事! 请注意,elasticsearch使用@timestamp字段来做索引,因此我建议不要更改字段名称。

input {
    stdin{
        type => 'netflow'
    }
}

filter {
    ruby {
        code => "
            data = event.clone.to_hash;
            type = event['type']
            data.each do |k,v|
                if k != '@timestamp'
                    newFieldName = type +'.'+ k
                    event[newFieldName] = v
                    event.remove(k)
                end
            end
        "
    }
}

output {
    stdout{
        codec => rubydebug
    }
}