Ruby - 在 logstash 中获取价值

Ruby - getting value in logstash

我有一个字段,值输出看起来像

A::field_1_2_3_4_22_5_6_7_8_365  => 6

因为字段名称是"dynamical"因为包含ip和端口。 如何使用 ruby 从字段名称中获取值并为其添加字段?它看起来像

A::field => 6
bIP => 1.2.3.4
bport => 22
cIP => 5.6.7.8
cport => 365

任何帮助将不胜感激!!谢谢

也许我没有完全理解这一点,但你可以使用数组和方法 .push 来添加:

Array=[1, 2, 5, 7]
@n = [3, 4, 6]
Array.push(@n) => Array=[1, 2, 3, 4, 5, 6, 7]

您可以使用以下代码:

field_name = 'A::field_1_2_3_4_22_5_6_7_8_365'
fields = field_name.split("_")
bID = "#{fields[1]}.#{fields[2]}.#{fields[3]}.#{fields[4]}"
bport = "#{fields[5]}"
bID = "#{fields[6]}.#{fields[7]}.#{fields[8]}.#{fields[9]}"
bport = "#{fields[10]}"

这是一个非常相似的问题的答案:

对于这种精确的情况,ruby 过滤器需要更多地参与才能捕获不同的东西

filter {
  ruby {
    code => "
      newhash = {}
      event.to_hash.each {|key, value| 
        re = /(\w::[a-z]+)_(\d+_\d+_\d+_\d+)_(\d+)_(\d+_\d+_\d+_\d+)_(\d+)/
        if key =~ re then
            field, bIP, bport, cIP, cport = key.match(re).captures
            newhash[field] = event[key]
            newhash['bIP'] = bIP.gsub('_', '.')
            newhash['bport'] = bport
            newhash['cIP'] = cIP.gsub('_', '.')
            newhash['cport'] = cport

            event.remove(key)
        end
      }
      newhash.each {|key,value|
        event[key] = value
      }
    "
  }
}

因此,如果您的活动中有类似 "A::field_1_2_3_4_22_5_6_7_8_365" => "6" 的字段,那么您的活动将包含以下字段:

{
      "A::field" => "6",
           "bIP" => "1.2.3.4",
         "bport" => "22",
           "cIP" => "5.6.7.8",
         "cport" => "365"
}