簡體   English   中英

Ruby - 在 logstash 中獲取價值

[英]Ruby - getting value in logstash

我有一個字段和值輸出看起來像

A::field_1_2_3_4_22_5_6_7_8_365  => 6

因為字段名稱是“動態的”,因為包含 ip 和端口。 如何使用 ruby​​ 從字段名稱中獲取值並為其添加字段? 它看起來像

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

任何幫助將不勝感激!!謝謝

這是一個非常相似的問題的答案: logstash name fields dynamic

對於這種精確的情況, 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"
}

您可以使用以下代碼:

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

也許我沒有完全正確地理解這一點,但您可以使用數組和方法 .push 來添加:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM